2013-08-20 25 views
1

我正在嘗試編寫一個程序,該程序讀取一組數據文件中有多少行/條目。我用下面的代碼,它工作正常(從得到:What is the easiest way to count the newlines in an ASCII file?讀取數據文件中的條目數C

#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個條目的小文件上嘗試這個,但我將在稍後使用一個非常大的文件,在每行之間有空格, m想知道如何區分......還是應該將line_count除以2以獲得條目數量?

回答

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

+0

完美的作品,謝謝! –

+0

也許它晚了,我的大腦只是不正常工作,但..雖然它運行完美,出於某種原因,我似乎無法完全理解..如果我有1.0'空間'2.0 ..它開始閱讀文件的第一個字符它遇到的是1.0 ..我只是在調試器中運行它以查看執行情況,並在它開始時如果(c =='\ n'),然後跳轉到其他if(!isspace(c))並執行那..然後它再次啓動while循環,並且它再次執行相同的操作..然後在第四次執行if(c =='\ n')循環並遞增newline_count ..我有點困惑只是.. –

+0

..我的意思是我沒有得到它做的..:/ 對不起,麻煩.. –