2015-03-13 32 views
0

我試圖驗證文件中的實際內容中的行,並退出一行中有兩個空行的情況。這可以做到嗎? 此代碼導致fgetc()沒有捕獲雙回車符/新行。是否可以在一行中測試兩個新的行字符?

代碼是來自C89項目的代碼片段,因此在片段上方進行了聲明。

if ((file = fopen(fileName,"r")) == NULL) 
{ 
    free(fileName); 
    exit(1); 
} 

while (c != EOF) 
{ 
    cOld = c; 
    c = fgetc(file); 

    /* count lines */ 
    if(c == '\n'){ 
     newLine++; 
    } 

    /* test for two carriage returns in a row */ 
    if(c == '\n' && cOld == '\n'){ 
     printf("ERROR: Invalid File\n"); 
     free(fileName); 
     exit(1); 
    } 

} 
+1

使用調試器將幫助您解決這種簡單的問題。 – 2015-03-13 09:16:07

+0

一個方便的工具,讓你檢查你的文件是否包含'\ r \ n'或其他什麼,是[HexDump](http://www.fileformat.info/tool/hexdump.htm) – moffeltje 2015-03-13 09:27:24

+0

請注意,在十六進制ASCII中, \ n'== 0A和'\ r'== 0D – moffeltje 2015-03-13 09:30:29

回答

2

看來你正在windows上運行你的程序。在窗口中,行尾用'\ r \ n'表示。

因此,當您檢查c和cOld時,它們不會同時持有'\ n'。

在DOS/Windows機器上創建的文本文件與在Unix/Linux上創建的文件具有不同的行尾 。 DOS使用回車符和行 feed(「\ r \ n」)作爲行尾,而Unix只使用換行符(「\ n」)。 您需要小心在Windows 機器和Unix機器之間傳輸文件,以確保行結束符 正確翻譯。

請點擊此鏈接瞭解詳情: http://www.cs.toronto.edu/~krueger/csc209h/tut/line-endings.html

+0

我正在使用Linux。 – user2470057 2015-03-13 09:16:41

+0

...但我測試的文件是用windows編寫的...所以是的,我認爲這是問題所在。我會基於此做一些測試。這是令人困惑的,因爲我讀過的所有內容都表示所有操作系統都可以將'\ n'作爲新行處理。 – user2470057 2015-03-13 09:23:38

+0

此解決方案工作。我不需要關注任何鏈接,我只是將文件更改爲Unix行結束。事情進展順利。謝謝。 – user2470057 2015-03-13 09:25:54

相關問題