当前位置: 首页 > 知识库问答 >
问题:

关于C中文件流和缓冲区的问题

赵修诚
2023-03-14

我正在阅读“Unix环境中的高级编程”,在dection 5.5,P150中,它说:

1、关闭文件之前,将刷新所有缓冲输出数据。任何可能被缓冲的输入数据都会被显示
2。当进程正常终止时,所有带有未写入缓冲数据的标准I/O流都将被刷新。。。

在1中,这是否意味着当我使用fclose()关闭流时,缓冲的输入将被释放,以便某些数据不会写入文件中。如果没有,“文件已关闭”是什么意思?

在2中,“未写入的缓冲数据被刷新”是否意味着缓冲数据将写入文件?

共有1个答案

郭曾笑
2023-03-14

在#1中,“缓冲输入”是指程序可以从流中读取的数据。。。所以基本上是说,一旦关闭流,就无法从中读取更多数据。缓冲输入是可能已从与流关联的文件/设备读取并放置在流的输入缓冲区中的数据,但实际上尚未被代码读取(基本上是提前检索并等待您读取)。丢弃它不会阻止任何内容写入文件,因为它是从文件读取的输入,而不是要写入的输出。

在#2中,他们说当你的程序结束时(正常情况下),你的程序写入到那些流中的任何东西,如果没有写入到磁盘上的文件(或与该流关联的任何设备),都将被刷新,即实际写入磁盘,而不是放在缓冲区中。通常,流写入暂时保存在缓冲区中,只有在刷新缓冲区时才实际写入(这可能发生在缓冲区已满、调用fflush()时、流关闭时等情况下)

 类似资料:
  • 本文向大家介绍emacs 文件和缓冲区,包括了emacs 文件和缓冲区的使用技巧和注意事项,需要的朋友参考一下 示例 在Emacs中,文件的含义与操作系统中的含义相同,并且用于永久存储数据。甲缓冲器是正在编辑的文件的内部表示。可以使用将文件读取到缓冲区中C-x C-f,并且可以使用C-x C-s(将文件保存到当前位置)或C-x C-w(将文件写入其他位置,提示输入-等效于Save as)将缓冲区写

  • 当我打开netrw并选择一个文件时,它会在一个新缓冲区中打开。这意味着如果我转到之前打开的缓冲区,我将返回netrw,而不是我之前编辑的文件。 我如何改变这种行为,这样我就可以在netrw的缓冲区中打开新文件,或者关闭我用来打开文件的缓冲区?

  • 我有一个使用paramiko的缓冲区的问题,我在这里发现了同样的问题,其中一个解决方案指出: 如果您只是调用.open()来获取SFTPFile实例,而不是使用.get(),那么就对该对象调用.read(),或者只是将其交给Python标准库函数shutil.copyFileObj()来下载内容。这将避免Paramiko预取缓存,并且允许您下载文件,即使它没有那么快。 如果我有:

  • 在DirectX中,您可以有单独的渲染目标和深度缓冲区,因此可以绑定渲染目标和一个深度缓冲区、执行一些渲染、移除深度缓冲区然后使用旧的深度缓冲区作为纹理进行更多渲染。 你会如何在opengl中做到这一点?根据我的理解,您有一个帧缓冲区对象,其中包含颜色缓冲区和可选的深度缓冲区。我不认为我可以同时绑定多个帧缓冲器对象,我是否必须在每次更改时(可能一帧几次)重新创建帧缓冲器对象?普通的 opengl

  • 我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码...... 所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无

  • 我试图理解scanf和输入缓冲区之间的关系。我将scanf与以下格式字符串一起使用: 并尝试理解为什么我可以输入尽可能多的空白(输入,空白,选项卡)后,我输入一个数字,如54,并按回车键。 据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。 因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n] 现在从左到右计算s