本文代码仓库地址: gitee码云CSDN笔记仓库地址
以文本(txt)的方式进行读写文件【FileOperations01_xy】
// 文件操作 -- 以文本(txt)的方式进行读写文件
/*
* 操作文件需要包含头文件<fstream>
* f--file 文件、stream--流
*
* 操作文件的三大类:
* 1、ofstream:写文件 -- o:out 从程序里面出去,就是写到文件里面
* 2、ifstream:读文件 -- i:in 从外部进来程序,就是读
* 3、fstream:读和写文件 -- 没有标明是in还是out所以读和写都可以
*
* 写文件操作步骤:
* 1、创建流对象:ofstream ofs;
* 2、打开文件:ofs.open("文件路径", 打开方式);
* 3、写数据:ofs << "写入数据";
* 4、关闭文件:ofs.close();(手动操作,有开有关,养好习惯)
*
* 打开方式:
* ios::in -- 为读文件而打开的方式
* ios::out -- 为写文件而打开的方式【会覆盖原来文本中的内容】
* ios::ate -- 初始位置:文件尾
* ios::app -- 追加方式写文件【追加在的方式添加最文件内容的后面】
* ios::trunc -- 如果文件存在先将其删除,在创建
* ios::binary -- 二进制方式
*
* 读文件操作步骤:
* 1、创建流对象:ifstream ifs;
* 2、打开文件并判断文件是否打开成功:ifs.open("文件路径", 打开方式);
* 3、读数据:三种读取方式
* 4、关闭文件:ifs.close();(手动操作,有开有关,养好习惯)
*/
#include <iostream>
// 包含文件流的头文件
#include <fstream>
using namespace std;
// 验证 以文本(txt)的方式写文件
void fun01() {
ofstream ofs01;
// 默认情况下,文件不存在会新创建,不填具体路径默认路径是与项目在同一目录下
ofs01.open("01.txt", ios::out);
// 写入内容
ofs01 << "姓名:小印01" << endl;
ofs01 << "年龄:22" << endl;
ofs01 << "性别:男" << endl;
// 写完后关闭文件
ofs01.close();
}
// 验证 以文本(txt)的方式读文件
void fun02() {
ifstream ifs01;
ifs01.open("01.txt", ios::in);
// 判断打开文件是否成功
if (!ifs01.is_open())
{
cout << "文件打开失败!!!" << endl;
return;
}
// 读取数据 方法一:
// 创建一个字符数组,准备把文件中的数据全部放在数组中
char mChar01[1024] = { 0 };
// 判断文件中的数据放进数组中,文件中的数据全部读完后,再次循环去读就会返回false
while (ifs01 >> mChar01)
{
cout << mChar01 << endl;
}
ifs01.close();
cout << endl;
ifstream ifs02;
ifs02.open("01.txt", ios::in);
// 判断打开文件是否成功
if (!ifs02.is_open())
{
cout << "文件打开失败!!!" << endl;
return;
}
// 读取数据 方法二:
// 创建一个字符数组,准备把文件中的数据全部放在数组中
char mChar02[1024] = { 0 };
// 获取一行,参数1--获取行的地址,参数2--获取长度
while (ifs02.getline(mChar02, sizeof(mChar02)))
{
// 每次读取一行
cout << mChar02 << endl;
}
ifs02.close();
cout << endl;
ifstream ifs03;
ifs03.open("01.txt", ios::in);
// 判断打开文件是否成功
if (!ifs03.is_open())
{
cout << "文件打开失败!!!" << endl;
return;
}
// 读取数据 方法三:
char c03;
// 判断获取的自读是不是文件的末尾,EOF:E--end、O--of、F--File 文件末尾
while ((c03 = ifs03.get()) != EOF)
{
// 每次读取一个字符,不要进行换行,不然中文的鬼都不认识
cout << c03;
}
ifs03.close();
}
int main() {
fun01();
cout << "------------------分界线------------------" << endl;
fun02();
cout << endl;
system("pause");
return 0;
}
以二进制的方式进行读写文件【FileOperations02_xy】
// 文件操作 -- 以二进制的方式进行读写文件
/*
* 打开方式要指定为:ios::binary
*
* 注意:文件打开方式可以配合使用,利用 | 操作符
* 示例:用二进制方式写文件 ios::binary | ios::out
*
* 二进制方式读文件主要利用流对象调用成员函数read
* 函数原型:istream& read(char* buffer, int len);
* 参数解释:参数1--字符指针buffer指向内存中一段存储空间、参数2--len是读写的字节数
*
* 以二进制的方式进行读写文件尽量不要涉及到string类型的,可能会出问题,具体的我也不知道啦
*/
#include <iostream>
#include <fstream>
using namespace std;
class person_xy {
public:
char mName[64] = { 0 };
int mAge = 0;
};
// 验证 以二进制的方式写文件
void fun01() {
ofstream ofs;
// ofstream 也有有参的构造函数,可以把下面打开的步骤在实例化对象的时候就打开
// ofstream ofs("02.txt", ios::binary | ios::out);
ofs.open("01.txt", ios::binary | ios::out);
// 赋值
person_xy mp01 = { "小印01", 22 };
// 写入内容 参数1--需要的类型是const char*所以需要给强转、参数2--写的长度
ofs.write((const char*)&mp01, sizeof(mp01));
// 写完后关闭文件
ofs.close();
}
// 验证 以二进制的方式读文件
void fun02() {
ifstream ifs;
ifs.open("01.txt", ios::in | ios::binary);
if (!ifs.is_open())
{
cout << "文件打开失败!!!" << endl;
return;
}
person_xy mp;
// 打印读文件前的姓名和年龄
cout << "姓名:" << mp.mName << "\t 年龄:" << mp.mAge << endl;
// 读文件 怎么写进去的就怎么给读出来:参数1--需要char* 的类型,把接收的类型强转、参数2--读取的字符长度
ifs.read((char*)&mp, sizeof(ifs));
// 打印读文件后的姓名和年龄
cout << "姓名:" << mp.mName << "\t 年龄:" << mp.mAge << endl;
// 读完后关闭文件
ifs.close();
}
int main() {
fun01();
cout << "------------------分界线------------------" << endl;
fun02();
cout << endl;
system("pause");
return 0;
}
一点点笔记,以便以后翻阅。