1

我正在尝试编写一个C程序来读取集合数据文件中有多少行/条目。我已经使用了下面的代码,它工作正常(来自:什么是最简单的方法来计算 ASCII 文件中的换行符?

#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 以获得条目数?

4

1 回答 1

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

于 2013-08-20T00:07:49.597 回答