这对于发现错误来说是一个很好的问题.没有?至少对初学者好.
#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)所以,改用1 :-)
看一下这篇文章,了解使用fread的缓冲IO示例.
该类型'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.