当我也打印出行时,为什么行数显示为0但是当它只是行计数时工作正常

时间:2017-05-31 07:52:23

标签: c file-io

因此,当另一个被注释掉时,从txt文件中打印行的代码和用于计算txt文件中的行的代码都工作正常,但是当我试图使两者都工作时,只有首先出现的代码才能工作,例如如果我先把代码打印出来,那么行数总是为零。但是,如果我把代码放在第一行计数,那么数字是正确的,但是不打印txt文件中的行:S

#include <stdio.h>

int main(int argc, char const *argv[])
{
    const int SIZE = 128;
    char line[SIZE];
    FILE *srcFile;
    int c;
    int count = 0;  // Line counter (result)

    if (argc == 1)
    {
        printf("No command line arguments given!\n");
        return 1;
    }

    srcFile = fopen(argv[1], "r");

    if (srcFile == NULL)
    {
        perror("\n*** FILE OPEN FAILED ***");
    }
    else
    {   
        printf("\n*** FILE OPEN SUCCESSFUL ***\n\n"); 
    }

    while(fgets(line, SIZE, srcFile) != NULL)
    {
        printf("%s", line);
    }

    for (c = fgetc(srcFile); c != EOF; c = fgetc(srcFile))
    {
        if (c == '\n')
        {
            count ++;
        }
    }

    if(c != '\n' && count != 0) 
    {   
        count ++;
    }

    printf("The file %s has %d lines\n ", argv[1], count);

    fclose(srcFile);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

以下是大多数编程语言中如何使用文件的快速概述:

当您打开程序中的文件时,您会获得该文件的句柄。句柄表示取决于语言。在c中,它是FILE结构。句柄包含 - 除其他外 - 文件位置指示器。通过此句柄对该文件的每次读写都发生在该位置。通常,读/写操作会使该文件位置指示器前进。想一想:如何连续读取知道每次读取前一个读取的位置?您没有为read函数提供参数,告诉它从哪里读取。你只是“说”read。会发生的是,每个read调用都会读取文件位置指示符然后推进此指示符,因此当下一个read发生时,句柄会有一个更新的文件位置指示符。

因此,问题的解决方案是 - 如评论中所述 - 此位置指示符放在文件的开头。在c中,可以使用rewind完成此操作。

  

很奇怪代码片段必须包含该行   在与打印行相同的循环中计数

简单。伪代码:

line_count = 0
while (read line successful)
{
    print line
    increment line_count
}

print line_count