2017-09-24 52 views
0

我读一个名为data.txt与如下所示:阅读时,每行3个字符的文件,的sizeof(char)的不工作

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 
+0

不是你的问题的答案,而是:'sizeof(char)'总是'1',所以很少有任何理由明确地写出它。 – ruakh

+0

*正确的方式*不要对您的缓冲区大小如此吝啬。如果你认为你的最大大小是'3',那么32字符的缓冲区就足够了。并参见[**为什么while(!feof(file))总是错误的?**](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)。 –

+4

'fgets()'想要读取像'b','tab','5','line feed'这样的文本的_line_ - 这是4个字符。阅读_line_后,'fgets()'附加一个_null字符_。所以'singleLine []'应该至少是'singleLine [5]'。 – chux

回答

2
  1. 你的阵列只有两个字符和空终止室。
  2. 您的线条有四个字符(包括换行符)。
相关问题