我正在尝试编写一个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个条目的小文件上尝试这个,但是我稍后将使用一个很大的文件,在每个行之间有空格,所以我想知道如何区分。。。或者我应该把行数除以2来得到条目数?
最佳答案
您可以创建一个标志,告诉您在最后一个\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是不可靠的,除非保证在所有文件中都有双间距。
关于c - 在C中读取数据文件中的条目数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18324929/