需要用到 C++ 中另一个标准库 fstream
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
模式标志 | 描述 |
---|---|
ios::app | 追加模式。所有写入都追加到文件末尾。 |
ios::ate | 文件打开后定位到文件末尾。 |
ios::in | 打开文件用于读取。 |
ios::out | 打开文件用于写入。 |
ios::trunc | 如果该文件已经存在,则先删除该文件 |
ios::binary | 二进制方式 |
零、终端,缓冲区,文件三者的关系
从键盘输入的字符存储到缓冲区
从文件读取的数据也存储在缓冲区
然后调用命令输出到终端上
平常说的输入输出,都是指缓冲区的输入输出,缓冲区是主体
一、fstream的成员函数
tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数(long类型),代表当前get 流指针的位置 或 put 流指针的位置,所谓位置其实就是距离文件开头的字节数
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。
- seekg ( off_type offset, seekdir direction );
- seekp ( off_type offset, seekdir direction );
- ios::beg(默认的,从流的开头开始定位),
- ios::cur(从流的当前位置开始定位),
- ios::end(从流的末尾开始定位)。
// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );
// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );
// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );
bad()
- 如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
fail()
- 除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
eof()
- 如果读文件到达文件末尾,返回true。
good()
- 这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear(),没有参数。
getline()
在<istream>库中的getline()函数有两种重载形式:
- istream& getline (char* s, streamsize n );
- istream& getline (char* s, streamsize n, char delim );
作用是: 从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,
如果遇到delim 或 字数达到限制,则读取终止,delim都不会被保存进s对应的数组中。
二进制文件则使用下面成员函数
- write ( char * buffer, streamsize size );
- read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值(byte),表示要从缓存(buffer)中读出或写入的字符数
清空缓冲区
cin.sync(); //全部清空
cin.ignore(int , char ); //int形参表示最多删除多少字节,char形参表示遇到什么字符中断操作
二、文件操作过程
(1)打开文件
ofstream outfile; //创建文件对象
outfile.open("file.dat", ios::out | ios::trunc ); | 表示多种模式结合
ofstream <文件对象>("文件名",模式); //以输出方式创建文件对象 ,会自动关联到文件名
(2)关闭文件
<文件对象>.close();
(3)写入文件
<文件对象> << "This is a line.\n";
<文件对象> << "This is another line.\n";
(4)读取文件
while (!<文件对象>.eof()) //以行为单位进行循环
{
<文件对象>.getline (buffer,100);
cout << buffer << endl; //打印到终端上
}
(5)二进制文件读写
int main () {
char * buffer;
long size;
ifstream in (filename, ios::in|ios::binary|ios::ate);
size = in.tellg();
in.seekg (0, ios::beg);
buffer = new char [size];
in.read (buffer, size);
in.close();
cout << "the complete file is in a buffer";
delete[] buffer;
return 0;
}
参考:
https://blog.csdn.net/kingstar158/article/details/6859379