fstream类总结
- ofstream, ifstream, fstream
在头文件fstream中,在fstream类中,用open成员函数打开文件,实现类与文件的关联操作。
- open(filename, mode, prot):对所属类进行用指定的参数进行特定的文件关联
几种打开方式(mode):(这些方式可以用 '|' 组合起来)
ios::in |
打开输入(读)文件 |
ios::out |
打开输出(写)文件 |
ios::ate |
初始位置为文件尾 |
ios::app |
所有写入附加在文件末尾 |
ios::trunc |
如果所操作的文件已经存在了,就先删除 |
ios::binary |
以二进制打开 |
打开文件的属性(prot):(这些方式可以用'+'进行组合,这个参数可以省略不传)
0 |
普通文件,打开操作 |
1 |
只读文件 |
2 |
隐含文件 |
4 |
系统文件 |
- close():用来关闭文件,是文件重新变为可访问,对象流也可以打开其他文件了
1 #include <fstream> 2 using namespace std; 3 int main () 4 { 5 ofstream fw, fw1; 6 7 fw.open("test.txt"); 8 fw1.open("test1.txt"); 9 10 fw.close(); 11 fw1.close(); 12 13 return 0; 14 }
- 读写: 使用重载的'<<' 或者 '>>', 也可以使用成员函数来实现
1 #include <fstream> 2 using namespace std; 3 4 int main () 5 { 6 ifstream fr; 7 ofstream fw; 8 char word[200], line[200]; 9 10 fw.open("write.txt"); 11 fr.open("read.txt"); 12 13 fr >> word; //读取文件,一个单词 14 fr.getline (line, 100); //读取一行内容 15 16 fw << "write file test" << endl; 17 18 fw.close(); 19 fr.close(); 20 21 return 0; 22 }
- 判断文件状态
is_open():文件是否正常打开
bad():读写过程中是否出错(操作对象没有打开,写入的设备没有空间)
fail():读写过程中是否出错(操作对象没有打开,写入的设备没有空间,格式错误--比如读入类型不匹配)
eof():读文件到达文件末尾,返回true
good():以上任何一个返回true,这个就返回false
- 获得和设置流指针
- 对于所有的输入输出流都有至少一个指针,指向下一个要操作的位置
ofstream put_point
ifstream get_point
fstream put_point和get_point
- 获取流指针位置
tellg(): 返回输入流指针的位置(返回类型long)
tellp(): 返回输出流指针的位置(返回类型long)
- 设置指针位置
seekg(long position): 设置输入流指针位置为第position个字符(文件首位置为开始位置)
seekp(long position): 设置输出流指针到指定位置
- 缓存和同步
当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。
当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:
- 当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。
- 当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。
- 控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。
- 明确调用函数sync(): 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败。
参照博客传送门: 晨雪无痕