关于二进制文件读写的 read 和write的问题

ff5dq4 2007-04-21 02:36:28
我在书上看到这样的用法
使用 write把类对象写入文件保存,然后在使用read把文件读入对象里

我觉得这样做是个错误,因为对象大小可能不相同:写入文件的对象大小与
读取文件的对象大小不一样会引起保护错误
...全文
619 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ff5dq4 2007-04-21
  • 打赏
  • 举报
回复
<iostream>的
ff5dq4 2007-04-21
  • 打赏
  • 举报
回复
to 楼上我说的 是标准IO库中 IO类的方法 write 和 read
zhou02607 2007-04-21
  • 打赏
  • 举报
回复
当读的大小大于写的大小时,则读出的内容大小为写的大小。
zhou02607 2007-04-21
  • 打赏
  • 举报
回复
1. read

#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);

返回值:读取到的字节数;0(读到 EOF);-1(出错)

read 函数从 filedes 指定的已打开文件中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes :

A. 读取普通文件时,读到文件末尾还不够 nbytes 字节。例如:如果文件只有 30 字节,而我们想读取 100 字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。

B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。

C. 从网络读取时,网络缓存可能导致读取的字节数小于 nbytes 字节。

D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 nbytes 。

E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。

F. 在读取了部分数据时被信号中断。

读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。


2. write

#include <unistd.h>

ssize_t write(int filedes, const void *buf, size_t nbytes);

返回值:写入文件的字节数(成功);-1(出错)

write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。

对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。

mymtom 2007-04-21
  • 打赏
  • 举报
回复
没有什么问题呀!写进文件,再读出来,能有什么问题。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧