为什么这段代码没有输出预期的输出?

N 1*_*1.1 2 c fread

这对于发现错误来说是一个很好的问题.没有?至少对初学者好.

#define SIZE 4
int main(void){
  int chars_read = 1;
  char buffer[SIZE + 1] = {0};  
  setvbuf(stdin, (char *)NULL, _IOFBF, sizeof(buffer)-1);  
  while(chars_read){
    chars_read = fread(buffer, sizeof('1'), SIZE, stdin);
    printf("%d, %s\n", chars_read, buffer);
  }
  return 0;
}

使用上面的代码,我试图使用重定向从文件中读取./a.out < data.输入文件的内容:

1line
2line
3line
4line
Run Code Online (Sandbox Code Playgroud)

但是我没有得到预期的输出,而是混合了一些图形字符.有什么问题?


提示:(礼貌Alok)

  • sizeof('1') == sizeof(int)
  • sizeof("1")== sizeof(char)*2

所以,改用1 :-)

看一下这篇文章,了解使用fread的缓冲IO示例.

Alo*_*hal 9

该类型'1'int在C,不是char,那么你正在阅读SIZE*sizeof(int)中的每个字节fread.如果sizeof(int)大于1(在大多数现代计算机上),那么您正在读取存储空间buffer.这是C和C++不同的地方之一:在C中,字符文字属于类型int,在C++中,它们是类型char.

所以,你需要chars_read = fread(buffer, 1, SIZE, stdin);因为sizeof(char)定义是1.

事实上,我会把你的循环写成:

while ((chars_read = fread(buffer, 1, sizeof buffer - 1)) > 0) {
    buffer[chars_read] = 0; /* In case chars_read != sizeof buffer - 1.
                               You may want to do other things in this case,
                               such as check for errors using ferror. */
    printf("%d, %s\n", chars_read, buffer);
}
Run Code Online (Sandbox Code Playgroud)

要回答你的另一个问题,'\0'int0,所以{'\0'}并且{0}是等价的.

因为setvbuf,我的文件说:

size参数可以给出为零以像往常一样获得延迟的最佳大小缓冲区分配.

你为什么和评论\\,而不是///* */?:-)

编辑:根据您对问题的编辑,sizeof("1")是错误的,sizeof(char)是正确的.

sizeof("1")是2,因为"1"是一个char包含两个元素的数组:'1'0.