读取C中数据文件中的条目数

时间:2013-08-20 00:02:21

标签: c string file-io long-integer

我正在尝试编写一个 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得到条目数?

1 个答案:

答案 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是不可靠的,除非您保证所有文件都有双倍间距。