目录
前言:
对于输入输出流解释:
在C++中,输入输出是同流来完成的。
输出操作将一个对象的状态转换成一个字符序列,输出到某个地方。
输入操作也是从某个地方接收到一个字符序列,然后将其转换成一个对象的状态所要求的格式。
这整个操作就像数据在流动 ,因此我们把接收输出数据的地方 叫目标 ,把输入数据的来源 称作源。
因此我们可以把输入和输出操作看成字符序列在源、目标以及对象之间的流动。
为什么要学习文件操作?有什么用?
因为大部分数据临时数据,在程序执行完毕会销毁,有时候需要有一些重要数据保存,所以需要在文件里进行保存
通过文件使数据持久化,而文件操作时要包含一个头文件------> <fstream>
分类:
分为文本文件和二进制文件
文本文件 是文件以ASCII码的形式存储在计算机中
二进制文件 是数据以二进制形式存储在计算机中,用户一般不能读懂,但是可以正常读取出来
操作文件的三大类流
在c++中文件操作就是通过流来完成的。
C++总共有输入文件流 、输出文件流 以及输入输出文件流3种。
要打开一个输出文件流,要定义一个ofstream的类型的对象
要打开一个输入文件流,要定义一个ifstream的类型的对象
要打开输入输出文件流,要定义一个fstream的类型的对象ofstream:
用于写操作,简单来说就是创造这样一个流对象,用于写操作
ifstream:
用于读操作,------>创建一个用于读操作的流对象,
fstream:
用于读写操作(这个看上面两个就好理解了 (●'◡'●))
⭐对于文件流对象的解读
一个 输出流对象是 信息流动的目标
一个 输入流对象是 数据流动的源头
一个 iostream对象既可以****是数据流动的源也可以是信息流动的目标
1.文本文件:
1.1如何写文件?
1.程序要包含头文件
2.创建一个流对象,例如:ofstream ofs;
3.打开文件 ofs.open("文件路径",打开方式)
(这里的文件路径可以只简单写一个test.txt,或者是写一个详细地址比如D:/test.txt)
4.写数据 ofs<<"写入的数据"<<endl;
(这里也可以不写endl)
5.关闭文件 ofs.close();
这个非常重要,不要忘了
文件打开方式:
ios::in → 仅可读文件
ios::out → 仅可写文件
ios::ate → 初始位置为文件的尾部
ios::app → 追加写入文件
ios::trunc → 如果文件原本存在那么先删除再创建
ios::binary → 二进制方式
注意:二进制文件打开方式可以配合使用"| "操作符
例如:用二进制的方式写文件ios::binary|ios::out
这样可以两种该方法一起使用
代码示例:
cpp#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include<fstream> void test1() { ofstream ofs;//o------output输出,f------file文件,stream------流 ofs.open("test.txt", ios::out);//不指定就和项目的地址一样了 ofs << "你好啊" << endl; ofs << "你叫什么啊" << endl; ofs << "你在哪里啊" << endl; ofs << "哈哈" << endl; ofs.close(); } int main() { test1(); system("pause"); return 0; }
如何查看文件?
1.右键点击
2.点击打开所在的文件夹
3.程序运行结束后,你会在这个文件夹下面看到你新建打开的文件
1.2如何读文件?
⭐要创建的流对象是ifstream
⭐如何判断文件是否可以打开成功
⭐函数功能简介(最常用的是最后一个)
函数 功能简介 bad() 如果进行非法操作,返回true,否则返回false clear() 设置内部错误状态,如果用缺省参量调用则清除所有错误位 eof() 如果提取操作已经到达文件尾,则返回true,否则返回false good() 如果没有错误条件和没有设置文件结束标志,返回true,否则返回false fail() 与good相反,操作失败返回false,否则返回true is_open() 判定流对象是否成功地与文件关联,若是,返回true,否则返回false,这个可以判断文件是否成功打开
代码示例(文件读取的3种方法):
cpp#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string>//注意这里不要写<string.h>它这个是旧的C 头文件,对应的是基于char*的字符串处理函数 #include<fstream> using namespace std; void test1() { ifstream ifs; ifs.open("test.txt",ios::in); if (!ifs.is_open()) { cout << "打开文件失败,请检查是否有错误"<<endl; return; } //1.方法 //char a[9999] = { 0 };//>>遇到空格会结束读入,读到空的时候它自动给你换行,这也是为什么最后总会空一行的原因 //while(ifs>>a) {//利用while循环把数据读到数组中 // cout << a << endl; //} //2.方法 //char a[1000] = { 0 }; //while (ifs.getline(a, sizeof(a))) //{ // cout << a << endl; //} //3.方法 string a; while (getline(ifs, a)) { cout << a << endl; } ifs.close(); } int main() { test1(); system("pause"); return 0; }
这里介绍3个方法,熟练运用一个就可以完成文件读取
文件读取的方式:
方法一:
cpp1.方法 char a[9999] = { 0 };//>>遇到空格会结束读入,读到空的时候它自动给你换行,这也是为什么最后总会空一行的原因 while(ifs>>a) {//利用while循环把数据读到数组中 cout << a << endl; }
方法二:
cpp2.方法 char a[1000] = { 0 }; while (ifs.getline(a, sizeof(a))) { cout << a << endl; }
方法三:
cpp3.方法 string a; while (getline(ifs, a)) { cout << a << endl; }
2.二进制文件
如何用二进制的方式对这个文件进行读写操作?
打开方式用ios::binary
注意:读出来为乱码但是文件看不懂没关系
2.1写文件
二进制可以操作很多数据类型
步骤:
先写头文件,再创建一个流对象,然后以写入的方式打开二进制文件,写入内容,关闭文件
⭐利用流对象调用write函数
用write函数,要使用强制类型转换为const char*
const char*类型就是常量字符串 ,例如"你好哈哈"就是常量字符串,const就是只可读 ,以防止源文件被改
代码示例:
cpp
void test1() {
ofstream o; //创建流对象
o.open("testbin.txt", ios::out | ios::binary); //二进制方式打开
//这里上面12步可以合为一步
//ofstream ofs("person.txt", ios::out | ios::binary);
Person p = { "小红",12 };
//把对象写入到o
o.write((const char*)&p, sizeof(p));
//关闭文件
o.close();
}
2.2读取文件
利用流对象去调用成员函数为read
函数原型为:istream &read(char *buffer,int len);
buffer指字符指针,指向内存的一段存储空间,len为读写的字节数
代码示例:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
using namespace std;
//避免用string,因为string实际上是一个类而不是类型,实现的东西有限
class person
{
public:
char m_name[12];
int m_age;
};
void test1()
{
//包含头文件
//创建流对象
ifstream ifs;
//打开文件
ifs.open("person.txt", ios::in | ios::binary);
if (!ifs.is_open()) {
cout << "文件打开错误" << endl;
return;
}
//读取文件
person p;
ifs.read((char*)&p, sizeof(person));//这里不用const,因为读取文件不需要防止更改文件内容
cout << "年龄:"<<p.m_age <<"姓名:" << p.m_name << endl;
//关闭文件
ifs.close();
}
int main()
{
test1();
system("pause");
return 0;
}
总结:
有关文件操作的内容就介绍完毕,感谢浏览,欢迎点赞收藏专栏,如有错误,请大佬指正,谢谢❀