我正在尝试编写一个 C 程序,该程序读取设置数据文件中有多少行/条目。我使用了下面的代码,它工作正常(来自:What is the easiest way to count the newlines in an ASCII file?)
#include <stdio.h>
int main()
{
FILE *correlations;
correlations = fopen("correlations.dat","r");
int c; /* Nb. int (not char) for the EOF */
unsigned long newline_count = 0;
/* count the newline characters */
while ( (c=fgetc(correlations)) != EOF ) {
if ( c == '\n' )
newline_count++;
}
printf("%lu newline characters\n", newline_count);
return 0;
}
但我想知道是否有办法改变这一点
if ( c == '\n' )
newline_count++;
进入其他内容,以便在您的数据看起来像
时1.0
2.0
3.0
(带有一个条目,然后新行是一个空格,然后是一个条目,然后是空格),而不是
1.0
2.0
3.0
如何区分字符/字符串/整数和新行?我试过%s但它没有用.. 我只是在一个只有3个条目的小文件上首先尝试这个,但我稍后会使用一个非常大的文件,我在每行之间有空格,所以我想知道如何区分......或者我应该分开line_count加2得到条目数?
答案 0 :(得分:1)
您可以创建一个标志,告诉您在最后\n
之后至少看到一个非空格字符,这样只有当该标志设置为1
时才能增加行计数器:
unsigned int sawNonSpace = 0;
while ( (c=fgetc(correlations)) != EOF ) {
if ( c == '\n' ) {
newline_count += sawNonSpace;
// Reset the non-whitespace flag
sawNonSpace = 0;
} else if (!isspace(c)) {
// The next time we see `\n`, we'll add `1`
sawNonSpace = 1;
}
}
// The last line may lack '\n' - we add it anyway
newline_count += sawNonSpace;
将计数除以2是不可靠的,除非您保证所有文件都有双倍间距。