目录
一、文本文件
1.写文件基本样式
#include<iostream>
#include<fstream>//包含头文件
using namespace std;
int main() {
ofstream ofs;//创建流对象
ofs.open("test.txt",ios::out);//以写方式打开文件“test.txt”
ofs << "张三" << endl;//写入内容
ofs << "李四" << endl;
ofs.close();//关闭文件
return 0;
}
但可以发现,系统在同级目录下创建了名为test.txt的文件
因此需要写入文件的绝对路径
ofs.open("C:\\Users\\86177\\Desktop\\test.txt",ios::out);
这样就可以了,但需要注意的是 \ 表示转义字符,需要改为 \\
打开方式 | 说明 |
ios::in | 只读 |
ios::out | 只写 |
ios::app | 追加 |
ios::ate | 在文件尾打开 |
ios::trunc | 如果文件存在,则删除文件再创建新文件 |
ios::binary | 以二进制形式打开 |
| | 以多种方式打开文件,如:ios::in | ios::binary 以二进制读方式打开文件 |
2.读文件基本样式
ifstream ofs;//创建流对象
string file_name = "C:\\Users\\86177\\Desktop\\test.txt";//要操作文件的路径
ofs.open(file_name,ios::in);//以读方式打开文件“test.txt”
if (!ofs.is_open()) {//判断文件是否成功打开
cerr << "文件" << file_name << "打开失败";
return 0;
}
读取数据保存方式:
方式1:
char buf[1024];
while (ofs >> buf) {//将ofs读取的数据写入buf,直到遇到换行符或文件末尾,则会返回false
cout << buf << endl;//测验
}
方式2:
while (ofs.getline(buf, sizeof(buf))) {//读到换行符返回false
cout << buf << endl;
}
方式3:
string buf;//用字符串类型接受
while (ofs.getline(buf, sizeof(buf))) {//读到换行符返回false
cout << buf << endl;
}
方式4:
char ch = 0;
while ((ch = ofs.get()) != EOF) {//一次读取一个字符
cout << ch;
}
二、二进制文件
1.写文件
ofstream ofs;//创建流对象
string file_name = "C:\\Users\\86177\\Desktop\\test.txt";//要操作文件的路径
ofs.open(file_name, ios::out | ios::binary);//以二进制写方式打开文件“test.txt”
if (!ofs.is_open()) {//判断文件是否成功打开
cerr << "文件" << file_name << "打开失败";
return 0;
}
Person p("张三", 23);
ofs.write((const char*)&p, sizeof(Person));//写入数据
ofs.close();//关闭文件
代码中的Person类:
class Person {
public:
string name;
int age;
Person() {
}
Person(string name, int age) {
this->name = name;
this->age = age;
}
};
结果:
发现是乱码
2.读文件
ifstream ifs;//创建文件流对象
ifs.open(file_name, ios::in | ios::binary);//以二进制读方式打开文件
if (!ifs.is_open()) {
cerr << "文件" << file_name << "打开错误" << endl;
return 0;
}
Person p2;
ifs.read((char*)&p2, sizeof(Person));//读取数据
cout << "p2.name=" << p2.name << " p2.age=" << p2.age << endl;
ifs.close();
运行结果:
总结:虽然二进制文件人读不懂,但计算机可以将之转化为对应的数据