曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3251|回复: 0
打印 上一主题 下一主题

read()/write() -- 文件数据块的读写

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-11-29 19:33:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用 get()  和 put()  函数分别从文件中读入和写入一个字符。如果想一次性读入或写入多个字符(数据块),那么可以使用 read() 和 write() 这两个 I/O 函数,它们的原型分别如下:
[C++] 纯文本查看 复制代码
istream &read(char *buf, streamsize num);
ostream &write(const char *buf, int streamsize num);

函数 read() 用来读入一个数据块,而 write() 则用来写入一个数据块,两个函数的数据块的大小由第 2 个参数 num 指定。

下面程序首先将一个整型数组的内容写入文件,然后再读入到这个数组:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
using namespace std;


int main()
{
        int n[5] = {1, 2, 3, 4, 5};
        register int i;


        ofstream out("test.txt", ios::out | ios::binary);
        if(!out) {
                cout << "Cannot open file.\n";
                return 1;
        }


        out.write((char *)&n, sizeof n);
        out.close();


        for (i = 0; i < 5; i++)
                n[i] = 0;


        ifstream in("test.txt", ios::in | ios::binary);
        if(!in) {
                cout << "Cannot open file.\n";
                return 1;
        }


        in.read((char *)&n, sizeof n);


        for (i = 0; i < 5; i++)
                cout << n[i] << " ";


        in.close();


        return 0;
}

运行输出:
./readwrite
1 2 3 4 5
cat test.txt
ls -al test.txt
-rw-r--r-- 1 beyes users 20 Nov 29 19:17 test.txt
注意,由于是纯二进制的写入到文件,因此在用 cat 命令查看生成的 test.txt 文本时没有像你所希望的那样输出 1,2,3,4,5 这几个数字。如平时你用 echo 或者 vi 编辑器对一个文本录入几个数字,然后用 cat 可以看到,那是因为不管是录入还是用 cat 来输出,都是按照系统当前所用编码(如 UTF-8)来进行。

由于我们使用的是二进制打开读写,而缓冲区数组此时被定义为整型(也可以为其它类型),那么在调用函数 read() 和 write() 时做强制类型转换(强制为字符数组,针对的每个单元是单个字节)是很有必要的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 11:17 , Processed in 0.080883 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表