因此,当另一个被注释掉时,从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;
}
答案 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