C-文件输入/输出缓冲区和setvbuf()

时间:2018-02-07 13:49:01

标签: c file buffer stdio

在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()函数引用什么缓冲区?

2 个答案:

答案 0 :(得分:4)

一个打开的文件只有一个缓冲区,无论它是为读,写还是两者都打开过。

详细fopen函数的C standard的第7.21.5.3节说明:

  

7 以更新模式打开文件(+作为上述模式参数值列表中的第二个或第三个字符时),两个输入   并且可以在关联的流上执行输出。 然而,输出   在没有干预呼叫的情况下,不得直接输入   fflush函数或文件定位函数(fseek,   fsetporewind),输入不得直接跟随   输出没有中间调用文件定位功能,   除非输入操作遇到文件结尾。打开(或   创建)具有更新模式的文本文件可以改为打开(或创建)a   在某些实现中的二进制流。

上面的段落规定输出缓冲区必须在执行输入之前刷新(通过定位函数显式或隐式),并且在输入后执行输出时也是如此。这是只有一个缓冲区的结果。

从逻辑的角度来看,这也是有道理的,因为它可以防止读写文件内容的视图不一致。

答案 1 :(得分:3)

  

setvbuf ()函数指的是什么缓冲区?

"这两种"他们没有要求对fopen()的调用将为读写模式创建两个缓冲区"。大多数实现都使用单个缓冲区,因为这就是所有需要的。

The C standard隐式支持单个缓冲区。每7.21.5.3 The fopen function, paragraph 7

  

以更新模式打开文件时('+'作为第二个   或上面的模式参数值列表中的第三个字符),   输入和输出都可以在相关联的上执行   流。但是,不应直接输出   输入没有对fflush函数的干预调用或   到文件定位功能(fseekfsetposrewind),   输入不得直接跟随输出   除非输入,否则对文件定位功能进行干预调用   操作遇到文件结束。打开(或创建)文本文件   使用更新模式可以改为打开(或创建)某些二进制流   的实施方式。

该段的要求允许使用单个缓冲区。