曲径通幽论坛

标题: read()/write() -- 文件数据块的读写 [打印本页]

作者: beyes    时间: 2011-11-29 19:33
标题: read()/write() -- 文件数据块的读写
使用 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 = 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 << " ";


        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() 时做强制类型转换(强制为字符数组,针对的每个单元是单个字节)是很有必要的。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2