在C语言中,fopen()是否真的创建了两个缓冲区,一个用于输入,另一个用于输出?
这是我的C书所说的:
通常,使用标准I / O的第一步是使用f open()来实现 打开一个文件。 (回想一下,stdin,stdout和stderr 文件会自动打开。)fopen()函数不仅会打开 一个文件,但设置缓冲区(两个读写模式缓冲区),以及它 设置一个包含有关文件和...的数据的数据结构。
如果使用fopen()打开文件会创建两个缓冲区,处于写入模式,如“a +”,即读取和写入
version: 2
jobs:
build_and_test:
docker:
- image: circleci/node:7.10
working_directory: ~/checkout-dir
steps:
- checkout
- run: yarn install
- run: npm run build
- run: npm test
- save_cache:
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/checkout-dir
npm_publish:
docker:
- image: circleci/node:7.10
working_directory: ~/checkout-dir
steps:
- restore_cache:
key: v1-repo-{{ .Environment.CIRCLE_SHA1 }}
- run:
name: setup npm
command: |
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
- run: npm publish
workflows:
version: 2
build:
jobs:
- build_and_test
build_and_deploy:
jobs:
- build_and_test:
filters:
tags:
only: /v[0-9]+(\.[0-9]+)*/
branches:
only: master
- npm_publish:
requires:
- build_and_test
filters:
tags:
only: /v[0-9]+(\.[0-9]+)*/
branches:
only: master
setvbuf()函数引用什么缓冲区?
答案 0 :(得分:4)
一个打开的文件只有一个缓冲区,无论它是为读,写还是两者都打开过。
详细fopen
函数的C standard的第7.21.5.3节说明:
7 以更新模式打开文件(
+
作为上述模式参数值列表中的第二个或第三个字符时),两个输入 并且可以在关联的流上执行输出。 然而,输出 在没有干预呼叫的情况下,不得直接输入fflush
函数或文件定位函数(fseek
,fsetpo
或rewind
),输入不得直接跟随 输出没有中间调用文件定位功能, 除非输入操作遇到文件结尾。打开(或 创建)具有更新模式的文本文件可以改为打开(或创建)a 在某些实现中的二进制流。
上面的段落规定输出缓冲区必须在执行输入之前刷新(通过定位函数显式或隐式),并且在输入后执行输出时也是如此。这是只有一个缓冲区的结果。
从逻辑的角度来看,这也是有道理的,因为它可以防止读写文件内容的视图不一致。
答案 1 :(得分:3)
setvbuf ()
函数指的是什么缓冲区?
"这两种"他们没有要求对fopen()
的调用将为读写模式创建两个缓冲区"。大多数实现都使用单个缓冲区,因为这就是所有需要的。
The C standard隐式支持单个缓冲区。每7.21.5.3 The fopen
function, paragraph 7:
以更新模式打开文件时(
'+'
作为第二个 或上面的模式参数值列表中的第三个字符), 输入和输出都可以在相关联的上执行 流。但是,不应直接输出 输入没有对fflush
函数的干预调用或 到文件定位功能(fseek
,fsetpos
或rewind
), 输入不得直接跟随输出 除非输入,否则对文件定位功能进行干预调用 操作遇到文件结束。打开(或创建)文本文件 使用更新模式可以改为打开(或创建)某些二进制流 的实施方式。
该段的要求允许使用单个缓冲区。