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