\ n \ n后fgets没有停止

时间:2014-08-13 19:44:40

标签: c file stream fgets

我有以下代码:

while (fgets(line,1024,file))
{
    getchar();
    printf(line);
    i++;
    line = (char*)realloc(line, sizeof(char)*sizes[i]);
}

由于某种原因,当我打印该行时,它会打印两行。 怎么会这样?

完整代码:

int main()
{
    FILE * file = fopen("C:/Users/user/Desktop/a.txt","r");
    char c;
    int count=0;
    int words=0;
    int* sizes = (int*)calloc (count+1,sizeof(int));

    if (file)
    {
        do
        {
            c= getc(file);
            words++;

            if (c=='\n'|| c==EOF)
            {
                sizes[count]=words+1;
                count++;
                words=0;
                if (c=='\n')
                    sizes = (int*)realloc(sizes,(count+1)*sizeof(int));
            }
        }while (c!=EOF);

        rewind(file);
        char* line = (char*)malloc(sizeof(char)*(sizes[0]));

        int i=0;
        while (fgets(line,1024,file))
        {
                getchar();
                printf("%s",line);
                i++;
                line=(char*)realloc(line,sizeof(char)*sizes[i]);
        }

        printf(line);

        free(line);

        /*for (int i=0; i<8; i++)
        {
            printf("%d\n",sizes[i]);
        }*/

        free(sizes);
        fclose(file);
    }

    getchar();

    return 0;
}

如你所见,我计算每一行的长度,将其放入数组,而不是根据行的长度分配一个字符串。

4 个答案:

答案 0 :(得分:1)

你有一个额外的

printf(line);

while循环之后,导致最后一行打印两次。

如果您将内部循环中的打印更改为

printf("read[%d]: %s", i, line);

它会更加明显。相同的i不会被打印两次。如果您有一个奇怪的控制序列,如\v\r,但输出可能看起来在中间有一个换行符,但它仍然是相同的&#34; line&#34;正在印刷

答案 1 :(得分:1)

如果你只是按&#34;输入&#34;在getchar,会有一行。 如果您输入1个字母并输入,则会有2行。 如果输入2个字母并输入则会有3行

看看我要去哪里。你的输入在&#34;输入&#34;但getchar对一个字符感到满意,另一个字符在缓冲区中,它在下一个循环中得到。

样本输出:

total 192
1 <---------input
-rw-rw-r-- 1 nranjan3 nranjan3  1032 Jun 11  2013 parseCreateList.c
-rw-rw-r-- 1 nranjan3 nranjan3   462 Jun 14  2013 mpSpRec.c
12 <---------input
-rwxrwxr-x 1 nranjan3 nranjan3  8681 Jun 14  2013 mpSpRec.exec
-rw-rw-r-- 1 nranjan3 nranjan3   162 Jul 29  2013 mtTrace.log
-rw-rw-r-- 1 nranjan3 nranjan3  1280 Jul 29  2013 iccLogger.c
123 <---------input
-rwxrwxr-x 1 nranjan3 nranjan3  6662 Aug 20  2013 k.out
-rw-rw-r-- 1 nranjan3 nranjan3  1465 Aug 21  2013 stNewProcPar.c
-rwxrwxr-x 1 nranjan3 nranjan3 11624 Aug 21  2013 masterP
-rw-rw-r-- 1 nranjan3 nranjan3   321 Nov 25  2013 memTest.c

现在代替getchar你添加它,它将工作并显示1行,无论你键入多少字母

while (getchar() != '\n');

答案 2 :(得分:0)

如果您在询问代码中的额外新行,那么您可能需要去除getchar()函数。由于这个原因,它只是在新行中等待,当你输入时,你可以看到文件中的下一行。但是,您看起来像输出中的额外行。所以交换功能:

getchar();

使用:

getch();

我希望你能得到答案。

答案 3 :(得分:0)

char c;应为int c;。由于EOF必须与所有可能的字符不同,因此,如果您使用char c;,则要么找不到EOF,要么得到误报,具体取决于系统的char格式

继续前进:

while (fgets(line,1024,file))

1024替换为sizes[i]。这样可以防止缓冲区溢出。

{
    getchar();

getchar()会丢弃下一行的第一个字符。但是,如果下一行为空,则表示丢弃整个下一行。然后,您的行计数将与您正在阅读的行不同步(如果您仍在1024中使用fgets,则会导致未定义的行为,这可以解释为什么您会看到虚假输出。)

i++;

如果i >= count,你应该摆脱循环。

正如其他人所说,循环后printf(line);表示最后一行打印两次(如果包含任何%个字符,则会出现乱码)。

最后,don't cast malloc。除了使代码更加健壮之外,还可以使代码更容易阅读。您不需要sizeof(char),因为它总是1

NB。在你去的时候读取线条要好得多,而不是在文件上进行两次传递。