我正在尝试编写一个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/

10-15 06:18