目录[-]


      cpp中文件的输入输出方式与处理标准的输入输出方式非常相似,要写入文件,需创建一个ofstream对象,并使用ostream方法,如<<插入运算符或write(); 要读取文件,需创建一个ifstream对象,并使用istream方法,如>>抽取运算符或get()。


1、打开文件模式

默认情况下,打开一个文件会自动将文件清空。
ios_base::in    打开文件,以便读取
ios_base::out    打开文件,以便写入
ios_base::ate    打开文件,并移到文件尾
ios_base::app    追加到文件尾
ios_base::trunc   如果文件存在,则截短
ios_base::binary    二进制文件
ios_base: : ate与ios_base::app的区别在于ios_base: : ate只允许将数据添加到文件尾。另一个则为把指针放到文件尾。


2、写入文件过程

# 创建ofstream对象来管理输出流
ofstream fout;
# 将对象与文件关联起来。
fout.open("shawn.txt");//打开文件,默认为截短模式
fout.open("shawn.txt",ios_base::out|ios_base::app );//打开文件,添加的内容追加到文件尾
# 将元素写入文件
fout<<"shawn"<<endl;

3、确认文件是否正确打开

fin.open("shawn.txt");//打开文件,默认为截短模式
if(fin.is_open()){
    . 
    .
    .
}

4、打印出文件中的所有内容

char ch;
while (fin.get(ch))
    cout << ch;

5、存储格式区别

数据可以以二进制或文本格式进行存储。使用文本格式存储的优点是比较通用且易于读取,使用二进制存储是存储的计算机内部表示,不会降低精度,但是在不同系统或者相同相同,不同编译器情况下由于内部表示不同,而无法正常读取数据。
通常情况下以文本存储的文件后缀设定为.txt,该类型文件可以使用notepad打开,以二进制存储的文件后缀设定为.dat,该文件无法使用notepad打开,即使能够打开,显示的也是乱码。
• 以文本形式存储例

struct classData{
    char teacherName[30];
    double score;
    int numberOfStudents;
};
classData class_1;
//以下为写入过程
ofstream fout("class_1.txt",ios_base::out|ios_base::app );
fout<<class_1.teacherName<<" "<<class_1.score<<" "<<class_1.numberOfStudents<<"\n";

• 以二进制形式存储例

struct classData{
    char teacherName[30];
    double score;
    int numberOfStudents;
};
classData class_1;
//以下为写入过程
ofstream fout("class_1.dat",ios_base::out|ios_base::app|ios_base::binary);
fout.write((char *) &class_1,sizeof(class_1));

• 读取二进制形式存储的文件例

struct classData{
    char teacherName[30];
    double score;
    int numberOfStudents;
};
classData class_2;
//以下为文件读入过程
ifstream fin("class_2.dat",ios_base::in|ios_base::binary);
fin.read((char *) &class_2,sizeof(class_2));

read()和write()成员函数为对偶函数,必须使用read()来回复用write()写入的文件。


注意事项:在此方法中的结构体,不能使用string代替char数组,原因是string对象中并没有存储具体的字符串,而是包含了一个指向存储了字符串的内存单元的指针,因此在将结构体存储到文件中时,存储的不是字符串数据,而是指向字符串数据的指针,当再次读取该数据时,指针将变得无意义。