fgets读取的字数太多而不是存在

时间:2010-08-21 21:24:44

标签: c fgets

我有以下功能:

void writeResults(FILE* fp, FILE* fpw, Vector w, int size) {

 Vector x;

 while (1) {

       char line[MAX_DIMENSION];  //max dimension is 200

       if( (fgets(line,MAX_DIMENSION,fp)) == NULL) { //EOF
            return;
       }
       else {
           int i=0;
           while (line[i]!='\0') {
                printf("% d %c\n",i,line[i]); //print to check it
                i++;
           }
       }
 }
}

它读取的文件行是:

1,1
2,2

然而,当我打印每个char直到'\ 0'时,我得到了这个输出:

 0 1  
 1 ,  
 2 1  
 3   
 4   
 0 2  
 1 ,  
 2 2  
 3   
 4   

有没有人知道为什么它会读取额外的3和4个字符? (文件中没有多余的空格)。

注意:文件以下列方式打开:

FILE* fp = fopen(fileIn, "r");
if (fp == NULL) {
    perror("Couldn't open File");
    exit(errno);
}

3 个答案:

答案 0 :(得分:2)

不打印%c,打印%d,您将看到字符ascii代码。你会发现字符是回车和换行。 13和10

参考http://www.asciitable.com/

答案 1 :(得分:1)

回车,换行 - 在Windows上?

如果我们知道你是如何打开文件的话会有所帮助。如果您将其作为文本文件打开,那么您不应该看到两个额外的字符 - 只有一个用于换行符。但是,如果您将其作为二进制文件打开,它确实应该同时读取CR和LF。

如果你在Linux上,如评论中所示,那么我们有更多的诊断工具可用。也许最简单的开始是'od -c file';这将显示文件中的确切内容。请注意,如果文件曾经在Windows框中,它仍然可能具有CRLF行结尾。如果你使用'vim',它可能会告诉你文件类型是'[dos]'。

或者,您可以将字符打印为整数(以及字符):

printf("%d (%2d) %c\n", i, line[i], line[i]);

你应该看到49为'1',50为'2',44为',',10为换行(LF,'\n'),还有别的东西 - 这是个谜(但是CR会显示13。


CR是C源代码中的\r字符。它用于表示打印头应该移回到行的开头(打印机托架返回到行首); LF或换行将纸张向上滚动。 Windows和MS-DOS都使用CRLF(curr-liff)序列来指示行尾; Unix总是使用LF,也就是换行或NL; MacOS 9及更早版本仅使用CR。

答案 2 :(得分:1)

我认为您的输入文件包含 -

1,1
[SPACESPACE]
2,2
[SPACESPACE]

所以第一次fgets读起来像 -

line{'1',',','1','',''}

并且第二次读取

line{'2',',','2','',''}

这就是为什么,你得到了你指定的输出