最大的收获:对象数组的读写
以前对数组对象的读写总是崩溃,或者乱码,今天听老师讲了C++文件读写后,特意做点博客
记录下来,今天收获最大的就是对象数组的读写了
#include <iostream>
#include <bits/stdc++.h>//万能头文件,不想费劲地包含头文件
using namespace std;
struct T{
int data;
char a[10];//对象读写时,如果成员有string,一定要换成char[]或者new char[],否则程序容易崩溃!!
T():data(0),a("null"){
}
T(int _data,const char* des):data(_data){
std::strcpy(a,des);//把字符常量拷贝到数组里面
}
friend ostream& operator<<(ostream& os,const T& o){//重载一下“<<”
cout << "当前对象的值:" << o.data << "\t描述:" << o.a << endl;
return os;
}
};
int main()
{
{
ofstream out("C:\\Users\\axin\\Desktop\\a.data",ios::out);//"w"的方式打开文件,如果没有会创建新的文件
T t[3]={T(10,"123"),T(11,"456"),T(12,"789")};
for(int i=0;i<3;i++)//按块的方式把对象写到文件里面
out.write(reinterpret_cast<char*>(&t[i]), sizeof(T));//第一个参数必须强转为char*,第二个参数提供读取一个对象的字节数,字节数对了才能保证数据正确读写
}
T t[3];//先用默认初始化data为0,字符数组内容置为"null"
ifstream in("C:\\Users\\axin\\Desktop\\a.data",ios::in);//"r"方式读取
for(int i = 0 ; i < 3 && !in.eof() ; i++)
{
in.read(reinterpret_cast<char*>(&t[i]) , sizeof(T));//
cout << t[i];//边读边输出,内容正常,说明正常读取到内容了
}
return 0;
}
下面的内容基本都是照抄的了,供自己复习期末考的😀
课堂笔记
文本文件和二进制文件的区别
C++文件默认的输出是文本方式
文本文件是把字符转换成ASCII码存储
二进制文件是把字符转换成为01等二进制数来存储
read和write函数是按块进行读写的函数,编程方便,但是要注意的一点是:如果你把一个含有string成员的对象写入到文件中,就会导致程序崩溃,因此建议把string换成char[]存字符
ofstream out_1;//默认构造函数,打开文件需要用open函数,默认就是w方式写文件
ofstream out_2("D:\\a.txt");//含路径的构造函数,默认第二个参数是w方式写文件
ofstream out_3("D:\\b.txt",ios::out);//含路径的构造函数,显式指定w方式写文件
if(out_3){//成功打开可以返回true
}
out_1.close();//记得关闭文件