fwrite函数不会将任何内容输出到标准输出(stdout)

3
当我运行这段小代码并在控制台上输入3个整数时,由于fwrite语句,它的输出结果不会像应该的那样立即打印出来。只有在我不断地按回车键一段时间后才会打印。请帮忙解决? P.S:想学习比scanf和printf更快的方法。
#include<stdio.h>
int main(){
    int size[3];
    fread(&size,sizeof(int),3,stdin);
    fwrite(&size,sizeof(int),3,stdout);
    fflush(stdout);
    return 0;
}
2个回答

4
这是因为fread读取的是二进制数据,而不是格式化文本,所以当你告诉它读取3个“ ints”时,它将从stdin中读取3 * 4 = 12个字节的原始数据。如果你输入“1”“2”“3”,那么只有三个字节的文本,加上三个换行符。一旦你输入了12个字节,它可能会超过那部分,但是如果你想读取和写入实际文本,那么你的程序很可能已经出了问题。
你是指“学习比scanf和printf更快的方法。”好吧,这并不是一种更快的方法,而是一种破损的方法。如果在使用scanf和printf的某些代码中存在性能问题,请提出单独的问题,我们可以帮助解决。

你可以输入012345678912,然后得到你期望的结果,因为“0”的大小是1个字节。请参阅fread文档:函数fread()从指向流的指针stream所指向的位置读取nmemb个数据元素,每个元素的大小为size个字节,并将它们存储在由ptr给出的位置。 - Mr. C
明白了。非常感谢 John!实际上,我需要从标准输入中扫描大量的“ints”,对它们进行排序,最后将它们打印到标准输出中。使用传统的“scanf”和“printf”方法需要很长时间。应该怎么办呢? - prateekj_ahead

0

int 的大小为 4 字节,因此您的 fread() 将尝试读取 12 字节(4 * 3)。

当您在控制台上输入类似以下内容时:

1 2 3

这是6个字符 = 3个数字 + 2个空格 + 1个 \n

因此,您至少需要按回车键6次,以便它读取6个字节。

最好使用scanf()来获取整数

scanf("%d %d %d", &size[0], &size[1], &size[2]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接