C++流和文件操作
C++中流的概念
C++中输入输出操作使用流来完成,将输出输入的操作称为流类,实现流类的库为流类库
流类库头文件
#include <iostream>
C++常用流类派生关系:
-
ios
抽象的基类
-
istream
输入的流类。cin为该流类的对象
-
ostream
输出的流类。cout为该流类的对象
-
ifstream
读取文件数据流类
-
ofstream
向文件写入数据流类
-
fstream
向文件读写数据的流类
iostream头文件中定义的四个标准流对象
- cin——标准输入流,从输入设备中读取数据,可重定向为文件写入数据
- cout——标准输出流,在显示设备显示数据,可重定向为向文件读出数据
- cerr——标准错误输出流,向显示设备输出出错信息
- clog——标准错误输出流,向显示设备输出出错信息
文件操作
头文件
#include <fstream>
文件打开方式
打开方式 | 说明 |
---|---|
ios::in | 读文件方式打开文件,文件不存在打开失败 |
ios::out | 写文件方式打开文件,文件不存在久创建了再打开 |
ios::ate | 打开文件后,指针指向文件尾 |
ios::app | 以追加方式打开写文件 |
ios::trunc | 文件存在先删除再创建 |
ios::binary | 二进制方式 |
写文件
void write_file(void)
{
fstream ifs; //1、创建流对象
ifs.open("person.txt", ios::out); //2、打开文件
ifs << "name : guangjieMVP" << endl; //3、向文件中写入数据,使用<<运算符写入
ifs << "id : 5201314" << endl; //4、向文件中写入数据,使用<<运算符写入
ifs.close(); //5、关闭文件
}
int main(void)
{
write_file();
return 0;
}
函数名 | 参数1 | 参数2 |
---|---|---|
open | 文件路径,如D:\test\person.txt,不写路径默认当前目录 | 文件打开方式 |
读文件
四种方式:
//方式1,使用运算法>>读出数据到buf
void read_file1(void)
{
fstream ifs; //1、创建流对象
ifs.open("person.txt", ios::in); //2、打开文件
if(!ifs.is_open()) //3、判断文件是否打开成功
{
cout << "文件打开失败!" << endl;
return;
}
char buf[1024];
while(ifs >> buf) //4、使用运算符>>读出数据到buf
{
cout << buf << endl;
}
ifs.close();
}
void read_file2(void)
{
fstream ifs; //1、创建流对象
ifs.open("person.txt", ios::in); //2、打开文件
if(!ifs.is_open()) //3、判断文件是否打开成功
{
cout << "文件打开失败!" << endl;
return;
}
char buf[1024];
while(ifs.getline(buf, sizeof(buf))) //4、使用流对象中的读出函数从文件中读出数据放到buf中
{
cout << buf << endl;
}
ifs.close(); //5、关闭文件
}
void read_file3(void)
{
fstream ifs; //1、创建流对象
ifs.open("person.txt", ios::in); //2、打开文件
if(!ifs.is_open()) //3、判断文件是否打开成功
{
cout << "文件打开失败!" << endl;
return;
}
string buf;
while(getline(ifs, buf)) //4、从文件中读出数据放到buf中
{
cout << buf << endl;
}
ifs.close(); //5、关闭文件
}
void read_file4(void)
{
fstream ifs; //1、创建流对象
ifs.open("person.txt", ios::in); //2、打开文件
if(!ifs.is_open()) //3、判断文件是否打开成功
{
cout << "文件打开失败!" << endl;
return;
}
char c;
while((c = ifs.get()) != EOF) //4、使用流对象ifs.get()函数从文件one by one byte方式放到c中
{
cout << c;
}
ifs.close(); //5、关闭文件
}
int main(void)
{
write_file();
// read_file1();
// read_file2();
// read_file3();
read_file4();
return 0;
}
二进制方式读写文件
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
class Person
{
public:
int age;
string name;
public:
Person(string name = "zhangsan", int age = 20)
{
this->age = age;
this->name = name;
}
};
//二进制方式读写文件
void binary_write_read(void)
{
Person person("guangjieMVP");
Person person1;
//写文件
fstream ofs("test.txt", ios::out | ios::binary); //1、创建输出流对象
ofs.write((char *)&person, sizeof(person)); //2、写入数据
ofs.close(); //3、关闭文件
//读文件
fstream ifs("test.txt", ios::in | ios::binary); //1、创建输入流对象
if(!ifs.is_open())
{
cout << "打开文件失败!" << endl;
}
ifs.read((char *)&person1, sizeof(person1)); //2、读出文件数据
cout << "Person name : " << person1.name << endl;
cout << "Person age : " << person1.age << endl;
ifs.close(); //3、关闭文件
}
int main(void)
{
binary_write_read();
return 0;
}