2015-03-13 27 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

相关问题