c++标准库中对文件流的有3个类使用:
fstream类,它是 从iostream类派生的,支持对磁盘文件的输入和输出。
ifstream类,它是 从istream类派生的,支持对磁盘文件的输入。
ofstream类,它是 从ostream类派生的,支持对磁盘文件的输出。
输入是指,从磁盘文件输入到内存中调用,输出是,从内存中输出到磁盘文件中。
三者用法大致相同,下面以fstream为例,来进行文件的输入输出。
#include <fstream>
//fstream ffile;//fstream是类,可以使用默认的构造函数,也可以直接选择读取文件
//ffile.open("file.txt",ios::out);//两个参数,文件名,输入输出方式
fstream ffile("file.txt",ios::in);//
ffile.close();//使用后一定要关闭文件流,不然,无法完成输入输出操作
对于输入输出方式,如下:
ios::in 以输入方式打开文件
ios::out 以输出方式打开文件,为默认模式,如果已有文件,则将其中内容清空。
ios::app 以输出方式打开文件,写入数据添加在文件末尾
ios::binary 以二进制方式打开文件,若不指定,则为默认的ASCII方式打开文件,二进制格式时,即可以同时进行输入输出
ios::ate 文件指针指向文件末尾,即只能对文件的最后一个字符进行更改
ios::trunc 如果文件已存在,则删除所有数据,如果文件不存在,则新建一个文件,默认ios::out时,也默认此模式
ios::nocreate 打开文件,若文件不存在,则打开失败
ios::noreplace 若文件不存在,则新建一个文件,若文件存在,则操作失败,即不能对文件进行读写
对于ios::noreplace ios::nocreate,在c++中改成了ios::_Nocreate ios::_Noreplace
当声明只能输入时,进行输出操作是无效的,同理,以输出方式打开是不能进行输入的。
ASCII文件的操作是极其简单的,就如下,类似使用cout的输出与cin的输入一样。但<<和>>只能对char *,char 和const char *进行操作,不能直接输出string。
fstream ffile("file.txt",ios::out|ios::in);//
char get[5];
//ffile<<"awfaw";
for(int i=0;i<5;i++){
ffile>>get[i];
}
ffile.close();//使用后一定要关闭文件流,不然,无法完成输入输出操作
一些细节,ios::ate使文件指针指向文件末尾,若想要输出加ios::out|ios::in。
有put,get,getline等成员函数进行字符的输入输出。
ASCII只能进行输出或只能进行输入,不能同时输入输出。
fstream ffile("file.txt",ios::in|ios::out);//
char get[5];
ffile.put('9');
ffile.get(get[0]);
char str[5][10];
ffile.getline(str[0],10);//储存数组,和读取字数,其实这不是getline,而是一次读入指定数量数据
//ffile.get(get[1]);
ffile.getline(str[1],8);
ffile.close();
对于二进制文件:
使用read和write进行读写操作,二进制文件可以同时进行输入输出。
二进制文件读写时,文件指针会随着输入输出而改变,则有以下几种常用函数来控制文件指针:
tellg() 返回输入指针当前位置
seekg(int 文件中位置)设置输入文件中的指针的位置
seekg(int 偏移量,参考位置) 按照偏移移动到指定位置,参考位置共有三个 ios::beg 文件开头 ios::cur 当前指针位置 ios::end 文件末尾
teelp() 输出指针位置
seekp(int) 设置输出指针位置
seekp(int ,参考位置) 按照偏移设置指针位置
fstream ffile("file.txt",ios::binary|ios::in|ios::out);//输入输出
ffile.seekp(ios::beg);
ffile.write("cc",2);
char r[10];
ffile.seekg(5);//位置是从0开始的
ffile.read(r,2);
ffile.close();
使用“\r\n"进行换行操作。