C 如何使setvbuf中的_IOLBF选项工作
关于如何使用setvbuf实用程序使用完全缓冲/非缓冲流,web上有许多示例。但是,我正在努力使用行缓冲选项 假设我们有一个文本文件“nums.txt”,其中包含两行整数C 如何使setvbuf中的_IOLBF选项工作,c,io,streaming,io-buffering,C,Io,Streaming,Io Buffering,关于如何使用setvbuf实用程序使用完全缓冲/非缓冲流,web上有许多示例。但是,我正在努力使用行缓冲选项 假设我们有一个文本文件“nums.txt”,其中包含两行整数 >$ cat nums.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 我想读取文件并使用行缓冲选项将流输出到标准输出 观察:两行同时打印 预期行为:第一行将打印到标准输出,然后(一秒钟后)打印第二行 代码如下: int main(int argc, char *
>$ cat nums.txt
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19
我想读取文件并使用行缓冲选项将流输出到标准输出
观察:两行同时打印
预期行为:第一行将打印到标准输出,然后(一秒钟后)打印第二行
代码如下:
int main(int argc, char *argv[]) {
FILE *fp;
int BUFSIZE = 25;
char buffer[BUFSIZE];
if (argc != 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
else { fp = fopen(argv[1], "r");
setvbuf ( fp , buffer, _IOLBF , BUFSIZE );
while (fgets(buffer, sizeof(buffer), fp) != 0)
{
fputs(buffer, stdout);
fflush(fp);
sleep(1);
}
fclose (fp);
}
return 0;
}
你期望什么
fflush(fp)代码>要做什么?对输入的文件*
调用fflush
通常是毫无意义的,行为依赖于实现。@Jabberwocky它实际上是:“如果stream
指向未输入最新操作的输出流或更新流,则fflush
函数将该流的任何未写入数据发送到主机环境,并写入文件;否则,行为是未定义的。“您确定这是生成所述输出的源吗?它对我有效,即使由于fflush()而导致行瘫痪也是如此。”
和作为输入的源代码。每行以1秒的间隔打印。@AndrewHenle表示不是,但必须承认它不是standard@busybee.你说得对。实际上它是在Ubuntu linux终端上运行的。由于缺乏经验,我在cygwin中执行了这个程序,得到了上面描述的行为。无论如何,这个程序对于标志_IOLBF和_IOFBF,我仍然感到奇怪。你希望fflush(fp);
做什么?在输入文件*
上调用fflush
通常是毫无意义的,而且这种行为依赖于实现。@Jabberwocky它实际上是:如果stream
指向未输入最新操作的输出流或更新流,则fflush
函数会导致将该流的任何未写入数据发送到主机环境中写入文件;否则,行为是未定义的。“您确定这是生成所述输出的源吗?它对我有效,即使由于fflush()而导致行瘫痪也是如此。”
和作为输入的源代码。每行以1秒的间隔打印。@AndrewHenle表示不是,但必须承认它不是standard@busybee.你说得对。实际上它是在Ubuntu linux终端上运行的。由于缺乏经验,我在cygwin中执行了这个程序,得到了上面描述的行为。无论如何,这个程序对于旗子IOLBF和IOFBF,我还是很奇怪。
>$ ./myprogram nums.txt