C 如何使setvbuf中的_IOLBF选项工作

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 *

关于如何使用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 *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