【发布时间】:2018-03-05 07:42:16
【问题描述】:
我正在读取一个名为 data.txt 的文件,如下所示:
b 5
b 2
b 9
每行有 3 个字符:制表符之间的空格。
我有以下代码一次读取一行。
int main(int argc, char * argv[]){
FILE * filePointer;
filePointer = fopen("data.txt", "r");
char singleLine[3*sizeof(char)];
while(!feof(filePointer)){
fgets(singleLine, 3*sizeof(char), filePointer);
//printCharArray(singleLine);
puts(singleLine);
}
fclose(filePointer);
return 0;
}
singleLine 基本上是每行文本放入的缓冲区。我最初把它写成char singleLine[20],一个足够大的任意数字,但我希望它准确,所以我做了char singleLine(3*sizeof(char))。我的逻辑是每行有 3 个字符,所以这应该可行。
不幸的是它没有,运行它时,它打印出来如下:
b
5
b
2
b
9
当我粗心大意时,char singleLine[20],它可以正常工作,如下所示。但我想以正确的方式做到这一点。怎么了?
b 5
b 2
b 9
【问题讨论】:
-
不是你的问题的答案,但是:
sizeof(char)总是1,所以很少有任何理由明确写出来。 -
正确的方法是不要对缓冲区大小如此吝啬。如果您认为您的最大大小是
3,那么32字符缓冲区就足够了。并查看Why is while ( !feof (file) ) always wrong?。 -
fgets()想要读取 行 文本,例如b、tab、5、line feed- 即 4 个字符。在读取 line 之后,fgets()会附加一个 null 字符。所以singleLine[]至少应该是singleLine[5]。