1.文件操作
程序运行时产生的数据都是临时数据,一旦程序结束运行就会被释放我们可以通过文件操作将数据持久化保存。
文件的类型分为两种:
1.文本文档 :文件以文本的ASCII码形式存储在计算机中。
2.二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂。
在cpp中对文件操作要包含 #include <fstream>这个头文件,因为C++定义的文件的输入输出流类,在这个头文件里面声明。
文件操作的三大类
- ifstream 只读
- ofstream 只写
- fstream 读写
1.1文本文件
写操作
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream ofs; //先定义一个文件流对象
ofs.open("text.txt", ios::out);
//用open这个函数来打开这个文件,前面是你的路径
//后面是你的打开方式,这个路径可以是绝对路径也可以是相对路径
//或者可以这样写 第一步就给他定义好了
//ofstream ofs("text.txt", ios::out);
ofs << "你要写的数据" << endl;ofs.close();
//然后关闭这个文件
}
下面是打开方式
ios::in 只读
ios::out 只写
ios::app 从文件末尾开始写,防止丢失文件中原来就有的内容
ios::binary 二进制模式
ios::nocreate 打开一个文件时,如果文件不存在,不创建文件
ios::noreplace 打开一个文件时,如果文件不存在,创建该文件
ios::trunc 打开一个文件,然后清空内容
ios::ate 打开一个文件时,将位置移动到文件尾
读操作
#include <iostream>
#include <fstream>
using namespace std;
void writetext() {
ofstream ofs("text.txt",ios::out);
if (!ofs) {
cout << "open error!" << endl;
exit(1);
}
ofs << "小明100200" << endl;
ofs.close();}
void readtext() {
ifstream ofs("text.txt", ios::in);
if (!ofs) {
cout << "open error!" << endl;
exit(1);
}
char c = 0;
while ((c = ofs.get()) != EOF) {
cout << c;
}
ofs.close();
}
int main() {
writetext();
readtext();
}
1.这种方法是一个字节一个字节读的,跟C的fgetc()函数很像,你的char c相当一个缓存空间,先把他从文件中读出来在用cout输出到你的屏幕上
char c = 0;
while ((c = ofs.get()) != EOF) {
cout << c;
}
2.这中方法是一行一行读取的,跟C的fgets()函数很像,你的buf是一个缓存空间,一行一行读进去了,读到文本或者空行getline()的返回值一直是true,如果读取失败,那么会抛出相对应的异常,最后在输出在cout到你的屏幕上。
char buf[1024] = { 0 };
while (ofs.getline(buf,sizeof(buf))){
cout << buf << endl;
}
对于 getline的函数原型是这样的
第一个参数是你的缓存区的地址,第二个是你缓存区的的大小。
他的返回值是这样的
3. 这就是往缓存区里面放,读完就在while里面返回EOF(也就是-1,他已经给你处理好了#define EOF -1),在cout给你打在屏幕上。
char buf[1024] = { 0 };while (ofs >> buf){ cout << buf << endl;}
1.2二进制文件
因为以二进制的方式对文件进行读写操作,所以打开方式要指定为 ios::binary和一个位或操作符结合。
写操作
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void writetxt()
{
char buf[1024] = { 0 };
ofstream ofs("f1.txt", ios::out | ios::binary);
ofs << "你要写入的" << endl;
ofs.write((const char*)buf, sizeof(buf));
ofs.close();
}
void readtxt()
{
char buf[1024] = { 0 };
ifstream ifs("f1.txt", ios::in | ios::binary);
if (!ifs) {
cout << "open error!" << endl;
}
ifs.read((char*)buf, sizeof(buf));
cout << buf << endl;
}
int main() {
writetxt();
readtxt();
return 0;
}
这里主要用了write这个函数他的传参是这样的
还是一个缓存空间,缓存空间的长度
读操作就是加了一个read函数他的函数原型是这样的
传参跟write很像只是这块是char类型