0

我有以下功能:

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

但是,当我打印每个字符直到 '\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);
}
4

3 回答 3

2

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

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

于 2010-08-21T21:33:42.033 回答
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 代表 ',',44 代表 ',',10 代表换行符(LF, ' \n'),还有其他的东西 - 这是个谜(但它会显示 13 代表 CR)。


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

于 2010-08-21T21:28:20.593 回答
1

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

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

所以第一次 fgets 读起来像-

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

第二次阅读

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

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

于 2010-08-21T21:36:24.427 回答