c语言-c标准库的fputc写入文件的机制问题

问题描述

c标准库的fputc写入文件的机制问题

最近用c编一个小程序,用到fputc向文件内写入字符,希望保持原有文件内容而能覆盖特定位置的字符。使用fputc以rt+方式打开文件可以实现这个。可是问题来了,硬盘在读写的时候将同时读写一整个扇区,那么fputc实现覆盖文件某个位置的字符是怎样实现的呢?是将一整个扇区读入后修改对应字符再写入?那么这样的话势必需要一个缓冲区,如果真是这样,这个缓冲区会维持到什么时候呢?比如我连续调用两次fputc,写入的数据在都同一扇区内,需要读取几次文件?

解决方案

这个根本不劳你操心,这些是操作系统底层甚至硬件的事情。硬盘自身、操作系统都有缓存。

通常一个机械硬盘自身带有8~64MB的缓存,并且它会自动优化读写顺序,避免来回寻址。操作系统的IO缓存就更大了。这个没法估计。

而且,事实上,现代的硬盘,因为容量非常非常大,速度非常非常快,每次读写其实都不是1个扇区,可能是8个扇区或更多——即便你只修改一个字节。

不过不管怎么说,从你编程的角度看,你不用关心底层这些实现,操作系统和硬盘本身无论怎么设计,都保证了你的数据读写是没有问题的。

解决方案二:

你看的教材,通常都是几十年前的东西,这个世界早就完全变了。

好比,我们管汽车的加速踏板叫做油门,但是其实现在的喷油量都是计算机控制的,你踩下加速踏板,其实控制的是节气门的开闭,你感觉到和油门的差别了么?

车还是一样的开。

甚至在电动车上,油门踏板其实控制的是电机,但是你同样不要重新培训就能驾驶。

一样的道理,你讨论的这些,基本上都毫无意义。对于一个C程序员来说,他写的程序可能变化不大,但是底层的实现完全变了。不过你不用过分担心。这些都是向前兼容的。

解决方案三:

C标准库文件之string.c文件
C标准库 memset 的一个问题

时间: 2024-10-02 20:00:22

c语言-c标准库的fputc写入文件的机制问题的相关文章

Python标准库03 路径与文件 (os.path包, glob包)

原文:Python标准库03 路径与文件 (os.path包, glob包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   路径与文件的简介请参看Linux文件系统   os.path包 os.path包主要是处理路径字符串,比如说'/home/vamei/doc/file.txt',提取出有用信息. import os.path path = '/home/vamei/doc/file.txt' print(os.pa

C++著名类库和C++标准库介绍

C++著名类库 1.C++各大有名库的介绍--C++标准库 2.C++各大有名库的介绍--准标准库Boost 3.C++各大有名库的介绍--GUI 4.C++各大有名库的介绍--网络通信 5.C++各大有名库的介绍--XML 6.C++各大有名库的介绍--科学计算 7.C++各大有名库的介绍--游戏开发 8.C++各大有名库的介绍--线程 9.C++各大有名库的介绍--序列化 10.C++各大有名库的介绍--字符串 11.C++各大有名库的介绍--综合 12.C++各大有名库的介绍--其他库 1

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢:(2)质量:标准库的都是经过严格测试的,正确性有保证:(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平:(4)良好的编程风格:采用行业中普遍的做法进行开发. 在C++程序设计课程中,尤其是作为第一门程序设计课程,我们注重了语法.语言的

C++标准库简介、与STL的关系。

转自http://www.cnblogs.com/xiongjiaji/archive/2011/06/22/2476490.html C++标准库的所有头文件都没有扩展名.C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能. 形式的标准头文件[ 例外]其内容与ISO标准C包含的name.h头文件相同,但容纳了C++扩展的功能.在 形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明.在C++中还可以使用name.h形式的标准C库头文件名.

一文读懂Go语言的net/http标准库

点击标题下「异步图书」可快速关注 在进行Web应用开发的时候,使用成熟并且复杂的Web应用框架通常会使开发变得更加迅速和简便,但这也意味着开发者必须接受框架自身的一套约定和模式.虽然很多框架都认为自己提供的约定和模式是最佳实践(best practice),但是如果开发者没有正确地理解这些最佳实践,那么对最佳实践的应用就可能会发展为货物崇拜编程(cargo cult programming):开发者如果不了解这些约定和模式的用法,就可能会在不必要甚至有害的情况下盲目地使用它们. 货物崇拜编程 第

我自己关于C语言,编译器,标准库,GUN glibc,CRT ,API之类的理解。

先声明,只是我自己看了一些东东的想法. 因为以前这一套东东太缠绕人了. C语言,是一种语言标准,和它对照的是C++,JAVA,BASIC,FORTRAN,PASCAL等等概念.它定义的是自己一套适用于计算机的标准规范.如关键字,数据类型,表达式,语句结构等等,它不包含强制具体的实现,没有强制INT数据类型的长度一定是4等.这种具体而微的定义,一般是各编译器厂商实现的.所以,那本经典的二人合著本的C教材第二版,其实很薄.真正C语言标准的内容,不多. 编译器和标准库,其实是不同的厂商依据C语言标准的

浅析C++标准库元组(tuple)源码_C 语言

一.什么是元组 元组不是什么新鲜东西,在数学.python语言还有我们今天要说的C++都有元组. 简单地说,元组就是一组东西,例如,在讲代数拓扑的时候,经常把拓扑空间X和其中一点x作为一个偶对(X, x),这其实就是个元组,点的坐标也可以看成一个元组.C++中的元组(tuple)是这个样子的: std::tuple<int, std::string> tu{ 2,"12iop" }; 一个tuple可以包含不同类型的成员,例如上面的tu包含一个int和一个字符串. 二.用法

深入解析Go语言的io.ioutil标准库使用_Golang

今天我们讲解的是golang标准库里边的io/ioutil包–也就是package io/ioutil 1.ioutil.ReadDir(dirname string)这个函数的原型是这样的 func ReadDir(dirname string) ([]os.FileInfo, error) 不难看出输入的是dirname类型是string类型的 譬如"d:/go",然会是一个FileInfo的切片,其中FileInfo的结构是这样的 复制代码 代码如下:   type FileIn

C标准库&amp;lt;assert.h&amp;gt;的实现详解_C 语言

本文实例讲解了C标准库<assert.h>的实现过程及相关用法.分享给大家供大家参考.具体分析如下: 一.背景知识 头文件<assert.h>唯一的目的就是提供assert宏定义,可以在程序中关键的地方使用这个宏来进行断言.如果一处断言被证明非真,希望程序在标准错误流输出一条适当的提示信息,并使执行异常终止. 可以这样写代码: #include<assert.h> ... assert(0 <= i && i < sizeof(a) / si