C++中把文件当作类,有三个类:ifstream,ofstream,fstream。头文件如下
#include<ifstream>
#include<ofstream>
#include<fstream>
其中ifstream实例化后的对象只能读取文件,ofstream实例化后的对象只能写入文件,而fstream实例化的对象读写文件都可以。
文件操作的一般步骤是什么样的呢?
- 打开文件(打开方式)
- 判断文件是否打开成功(这一步非常重要,否则在debug的时候会很麻烦)
- 进行文件操作
- 操作结束后关闭文件(关闭文件也很重要,如果没有关闭文件,那么后面其他代码如果要再次对该文件进行操作就会失败,因为该文件已经在另外一个文件对象中打开,就有点像windows中你无法删除一个打开中的文件,只有在该文件关闭后才能删除。
-
打开文件
法1:先创建一个无参文件对象,然后通过open成员函数打开
#include<fstream> fstream file1; //创建无参文件对象 file1.open("1.txt",ios::in|ios::out) //第一个参数为文件名,第二个参数为打开方式 //打开方式如下 //ios::in ,读的方式打开 //ios::out,写的方式打开 //ios::nocreate,不创建文件 //ios::noreplace,不替换文件 //ios::binary,以二进制文件打开 //ios::trunc ,文件不存在创造文件 //ios::app ,追加的方式打开文件 //ios::ate 在已有文件,文件指针在末尾 //可以通过位或符号|进行组合(两种及以上),比如可读写就是ios::in|ios::out
法2:直接通过构造函数来打开文件
#include<ifstream> ifstream file2("1.txt",ios::in)
-
判断文件打开是否成功
法1:使用成员函数is_open()
if(!file1.is_open()) cout<<"文件打开失败"<<endl;
法2:直接用文件对象判断
if(!file1) cout<<"文件打开失败"<<endl;
-
文件操作(读写)
法1:使用流的方式,读取的时候会忽略空格和换行,可以按照字符读取,也可以按照字符串读取碰到空格则认为字符串结束。
fstream file3("1.txt",ios::in); fstream file4("2.txt",ios::out|ios::trunc) if(!file3)cout<<"文件打开失败"<<endl; while(file3) { string a; file3>>a; //把file3的第一个字符串赋值给a file4<<a;//把a的内容赋值给file4; } file3.close(); //关闭文件 file4.close(); //关闭文件
法2:使用成员函数get(),put()只能一个一个字符读取,不会忽略空格
fstream file3("1.txt",ios::in); fstream file4("2.txt",ios::out|ios::trunc) if(!file3)cout<<"文件打开失败"<<endl; while(file3) { char a; file3.get(a); //把file3的第一个字符赋值给a file4.put(a);//把a塞入file4; } file3.close(); //关闭文件 file4.close(); //关闭文件
[[C++文件的编译问题]]