2013-02-06 27 views
-3

正文:Hi\r\n how is it going \r\nareyouoay\r\n;答案應該是3,新的生產線並不意味着\n這意味着嚴格\r\n,所以只是有\n不好使用c計算文件中的新行c

,這裏是我的嘗試,我究竟做錯了什麼?

FILE *fp = fopen(fileName, "r"); 
int c, lastchar;   
int lineCount= 0; 
int i; 

while ((c=fgetc(fp)) != EOF) { 
    if (c == 'r' && lastchar == '\\' && c+1== '\\' && c+2=='n') 
     lineCount++; 
    lastchar = c; 
    i++; 
} 

該文本的輸出應該是3。

+0

在您的文本中,\ n表示兩個字符'\'和'n'連接,或者它表示單個字符'\ n'(ascii 10)? –

+0

「你好\ n如何\ r \ nare \ ryou \ r \ n」的答案是 –

+0

答案是兩個 – user1888502

回答

1

如果你必須在同一時間做你的搜索字符,你可以使用類似下面的代碼

int c;   
int lineCount= 0; 
int i = 0; 
char next[] = {'\\', 'r', '\\', 'n' }; 
while ((c=fgetc(fp)) != EOF) { 
    if (c != next[i]) { 
     i = 0; 
    } 
    else { 
     if (i == sizeof(next) - 1) { 
      i = 0; 
      lineCount++; 
     } 
     else { 
      i++; 
     } 
    } 
} 

爲界輸入文件的大小,你會更好讀取整個文件到內存中,然後使用strstr。或者,對於較大的輸入,將塊讀入內存中,使用strstr並考慮如何避免在塊邊界上丟失匹配。

+0

只是'\ n'也會工作 –

+0

那不是我想要做的,我想專門計算\ r \ n並將其作爲一個字符串計算,因此如果單個行有Hi \ r \ n它怎麼樣\ r \ nareyouoay \ r \ n輸出應該是3,即使它全部在一行上。要做到這一點,我需要閱讀每個字符,並確保所有字符都發生。 – user1888502

+0

@simonc請閱讀以上 – user1888502

0

你做錯了什麼是,\n是1個字符,不是多個字符。

因此來算,你得行數做到這一點:

while ((c = fgetc(fp))!= EOF){ 
    if(c == '\n') lineCount++; 
} 

printf("No. of lines = %d", lineCount); 
+0

那不是我想要做的,我想特別指出\ r \ n並將其作爲一個字符串計算,因此如果單個行有Hi \ r \ n它將如何發生\ r \ n \ n \ n \ r \ n輸出應該是3,即使它全部在一行上。要做到這一點,我需要閱讀每個字符,並確保所有字符都發生。在我的方法中,計算線的方式不是\ n,\ n \ n將是文本,但如果用戶有\ r \ n,則表示新行 – user1888502

+0

請閱讀以上 – user1888502

0

字符\r\n是單個字符,所以讀你輸入的時候,你不會找到他們\\字符。而且,如果你在Windows上,你應該用模式"rb"打開你的文件以二進制模式打開它,否則運行時將去掉\r字符。

FILE *fp = fopen(fileName, "rb"); 
int lastchar = 0; 
int lineCount = 0; 
int c; 

while ((c = fgetc(fp)) != EOF) { 
    if (lastchar == '\r' && c == '\n') 
     lineCount++; 
    lastchar = c; 
} 

printf("line count: %d\n", lineCount); 

如果你真的想算四個大字\\r\\n繼承,那麼你可以這樣做的(似乎很奇怪,但也許你的輸入已經引用的字符序列):

FILE *fp = fopen(fileName, "rb"); 
char prevchars[4] = { 0, 0, 0, 0 }; 
char fingerprint[4] = { '\\', 'r', '\\', 'n' }; 
int lineCount = 0; 
int c, i; 

while ((c = fgetc(fp)) != EOF) { 
    if (memcmp(prevchars, fingerprint, 4) == 0) 
     lineCount++; 
    for (i = 1; i < 4; i++) 
     prevchars[i - 1] = prevchars[i]; 
    prevchars[3] = (char)c; 
} 

printf("line count: %d\n", lineCount); 
+0

這應該是一個正確的答案,但問題是試圖問如何搜索''\\ r \\ n「'即4個獨立的字符。其他兩個答案都採用了與您的方法相同的方法,因此問題不盡如人意。 – simonc