我有以下功能:
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);
}
答案 0 :(得分:2)
不打印%c,打印%d,您将看到字符ascii代码。你会发现字符是回车和换行。 13和10
答案 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','',''}
这就是为什么,你得到了你指定的输出