write/read是linux下的底层系统调用函数,fwrite与freadc/c++下的标准I/O库函数
read函数的原型是
有多种情况可以使实际读到的字节数少于要求读的字节数
- 读取普通文件时,如果文件有30个字节,而要求读100个字节,则第一个返回30.下一次调用时将返回0
- 读取终端设备时,最多一次读取一行
- 读取网络时,网络中的缓冲机制可能造成返回值小于所要求读的字节数
- 读取管道或者FIFO时,如果其中包含的字节少于所需数量,则read将只返回实际刻度字节数
- 读取面向记录的设置比如磁带时,一次最多返回一个记录
- 当一信号造成中断,而已经读了部分数据量时
对于普通文件,写操作从文件的当前偏移量处开始。如果在打开该文件时,指定了选项,则在每次写操作之前,将文件偏移量设置在文件的当前结尾处。在一次成功写之后,该文件偏移量增加实际写的字节数
read/write和fread/fwrite区别?
- fread是带缓冲的,read不带缓冲.
- fopen是标准c里定义的,open是POSIX中定义的.
- fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
- fopen不能指定要创建文件的权限.open可以指定权限.
- fopen返回指针,open返回文件描述符(整数).
- linux/unix中任何设备都是文件,都可以用open,read.
如果文件的大小是8k。你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。
如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。
也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。
如果程序对内存有限制,则用read/write比较好。
都用fread 和fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,用read和write,如套接口,管道之类的
系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下。而fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。
write/fwrite
write:
fwrite:
read/wirte
1、一次一个字节从标准输入复制到标准输出
2、
大多数文件系统采用了预读技术,当检测到正进行顺序读取时,系统就试图读入比应用所要求的更多数据,并假想应用很快就会去使用取这些数据
字节流套接字(比如TCP套接字)上的read和write函数所表现的行为不同于通常的文件IO。字节流套接字上调用read或者write输入或者输出的字节数可能比请求的数量少,然而这不是出错的状态。这个现象的原因在于内核中用于套接字的缓冲区可能已经达到了极限。此时需要调用者再次调用read或者write函数,以输入或者输出剩余的字节。
封装write:Writen
封装read: Readn
封装read: Readline
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13262.html