分类: C/C++
2013-08-23 20:16:35
1.
fread,fgets等函数都是从缓冲区读取数据,当缓冲区刷新,他们就读取成功。
fputs和fwrite等都是往缓冲区写入数据,当缓冲区刷新,他们就调用read和write系统调用,交给内核处理。
关闭文件,缓存中的输入数据会消失。fread每次从缓存中读取数据。为了防止关闭文件后,还可以fread,
2.
getc可被实现为宏,而fgetc则不能实现为宏
。所以getc更快捷,但是不可以使用复杂的表达式作为参数。
3.
fgets将换行符存入缓存
gets不保存换行符号
fputs并不额外输出换行符
puts额外输出一个换行符
分析表APUE3-1结果:
read和write系统内部调用也有缓冲区。
字符小的时候,缓冲区填不满就要刷新,所以往硬盘上写入的次数很多。用户和系统态切换的次数也很多,导致用户CPU和系统CPU都很大。后来缓冲区变大。每次缓冲区都可以填满,那么一次write调用写入硬盘的次数就一定了,所以随着缓冲区变大,系统CPU不变。
个人理解:现在就是不明白,在read大小没有到达read调用的缓冲区大小的时候,为什么时间会不变?
从表中看,0.3s稳定,那为什么会出现两次0.4?
按逻辑推理,随着buffsize的增大,系统CPU应该是按照1/2的速度减少。
但是这中间忽略了一个关键的量,就是系统和用户互相切换的时间。假如从内核态切换回用户态,那么系统CPU除了write调用还有切换时间。
所以当减少的时候,变化的会小于1/2,因为在总体比重中,切换时间所占比例变大。
4.
在一个系统上写的数据,在另一个。系统上处理。在这种环境下,fread和fwrite这两个函数可能就不能正常工作,其原因是:
(1) 在一个结构中,同一成员的位移量可能随编译程序和系统的不同而异(由于不同的对
准要求)
。确实,某些编译程序有一选择项,它允许紧密包装结构(节省存储空间,而运行性
能则可能有所下降)或准确对齐,以便在运行时易于存取结构中的各成员。这意味着即使在单
一系统上,一个结构的二进制存放方式也可能因编译程序的选择项而不同。
就是数据对齐的问题。之前的博客提到了
用来存储多字节整数和浮点值的二进制格式在不同的系统结构间也可能不同
当以读和写类型打开一文件时( type中+号)具有下列限制:
? 如果中间没有fflush、fseek、fsetpos或rewind,则在输出的后面不能直接跟随输入。
? 如果中间没有 fseek、fsetpos或rewind,或者一个输出操作没有到达文件尾端,则在输入操作之后不能直接跟随输出