目录
c++文件io
介绍
采用文件流对象操作文件的一般步骤
示例
注意点
利用字节流特性
字符串io
介绍
istringstream
ostringstream
示例
c++文件io
介绍
c++根据文件内容的数据格式分为二进制文件和文本文件
- 基本上和c一样
c++ 标准库中有许多不同的标志
- 用于指定流对象的行为,可以组合在一起以设置不同的模式:
采用文件流对象操作文件的一般步骤
定义一个文件流对象
- ifstream (只输入用) / ofstream(只输出用) / fstream(既输入又输出用)
使用文件流对象的成员函数打开一个磁盘文件
- 使得文件流对象和磁盘文件之间建立联系
- 使用提取和插入运算符对文件进行读写操作 / 使用成员函数进行读写
关闭文件
示例
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<fstream> #include<sstream> #include<string> using namespace std; struct info_data { char _data[50]; //不能使用string/vector int _port; }; class information { public: //ifstream& operator<<() information(const string& arr) //我们的文件操作首先需要一个文件路径 :_filename(arr) {} void b_read(info_data& info) { ifstream i(_filename, ios_base::in | ios_base::binary);//用二进制读方式打开 i.read((char*)&info, sizeof(info));//将流中数据读入info中 i.close(); } void b_write(const info_data& info) { ofstream i(_filename, ios_base::out | ios_base::binary | ios_base::app);//用二进制追加写方式打开 i.write((const char*)&info, sizeof(info));//将info写入流中 i.write("\n", sizeof("\n")); i.close(); } void t_read(info_data& info) { ifstream i(_filename); i >> info._data >> info._port;//将流中数据读入info中 i.close(); } void t_write(const info_data& info) { ofstream i(_filename, ios_base::out | ios_base::app);//追加方式 i << info._data << " " << info._port << endl; //将info写入流中(可以在中间加入空格和换行符,这样存入文件中的数据更易懂) i.close(); } private: string _filename; }; int main() { information t("test.txt"); //文本方式读写 info_data data; t.t_write({ "hello",80 }); t.t_read(data); cout << "data: " << data._data << " " << data._port << endl; //二进制方式读写 info_data tmp; t.b_write({ "hello",80 }); t.b_read(tmp); cout << "tmp: " << tmp._data << " " << tmp._port << endl; return 0; }
文件内容:
代码执行结果:
注意点
如果用string/vector存储数据(也就是字符串)
- 一旦字符串长度有点长,就会在堆上开辟空间存放数据,只会存储一个地址指向那块空间,那存入文件的也是那个地址
- 但下次程序执行,读取文件时,会读取到上次运行时生成的地址,在这次就是无效地址,越界访问了
- 注意,打开文件之后,如果不需要它了, 最好显式关闭文件
利用字节流特性
void test3() { ifstream i("code.cpp"); char c; while (i.get(c)) { cout << c; } }
- 利用文件中存储的数据是字节流形式,可以通过get函数获取字符,然后把某个文件全部读出
字符串io
介绍
istringstream
- 可以从一个字符串中提取数据
- 也是一种反序列化的过程,通常包括从字节流中读取数据,解码数据并将其还原为原始数据结构的字段
ostringstream
- 将数据格式化为字符串,可以像输出到标准输出流一样来构建字符串
- 属于简单序列化的过程
- 序列化过程通常包括将数据的字段按照一定的协议编码为字节流,并将其写入文件或通过网络发送
- 最后通过str()成员函数来获取格式化后的字符串
示例
void test2() { int a = 1; double b = 1.1; ostringstream o;//格式化写入 o << a << " " << b; string str = o.str(); cout << str << endl; ofstream i("test.txt", ios_base::out | ios_base::app);//将字符串写入文件 i << str << endl; i.close(); }
- 文件内容:
- 代码结果: