c++文件操作

目录

前言:

对于输入输出流解释:

为什么要学习文件操作?有什么用?

分类:

分为文本文件和二进制文件

操作文件的三大类流

ofstream:

ifstream:

fstream:

⭐对于文件流对象的解读

1.文本文件:

1.1如何写文件?

文件打开方式:

代码示例:

如何查看文件?

1.2如何读文件?

文件读取的方式:

方法一:

方法二:

方法三:

2.二进制文件

2.1写文件

步骤:

⭐利用流对象调用write函数

代码示例:

2.2读取文件

代码示例:

总结:


前言:

对于输入输出流解释:

在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个方法,熟练运用一个就可以完成文件读取

文件读取的方式:

方法一:
cpp 复制代码
1.方法
char a[9999] = { 0 };//>>遇到空格会结束读入,读到空的时候它自动给你换行,这也是为什么最后总会空一行的原因
while(ifs>>a) 
{//利用while循环把数据读到数组中
   cout << a << endl;
}
方法二:
cpp 复制代码
2.方法
char a[1000] = { 0 };
while (ifs.getline(a, sizeof(a))) 
{
   cout << a << endl;
}
方法三:
cpp 复制代码
3.方法
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;
}

总结:

有关文件操作的内容就介绍完毕,感谢浏览,欢迎点赞收藏专栏,如有错误,请大佬指正,谢谢❀

相关推荐
Mao_Hui9 小时前
Unity3d实时读取Modbus RTU数据
开发语言·嵌入式硬件·unity·c#
echome8889 小时前
Python 装饰器详解:从入门到精通的实用指南
开发语言·python
重生之后端学习9 小时前
62. 不同路径
开发语言·数据结构·算法·leetcode·职场和发展·深度优先
栗子~~9 小时前
hardhat 单元测试时如何观察gas消耗情况
开发语言·单元测试·区块链·智能合约
The hopes of the whole village9 小时前
Matlab FFT分析
开发语言·matlab
兰文彬9 小时前
n8n 2.x版本没有内嵌Python环境
开发语言·python
yiyaozjk9 小时前
Go基础之环境搭建
开发语言·后端·golang
谁动了我的代码?10 小时前
VNC中使用QT的GDB调试,触发断点时与界面窗口交互导致整个VNC冻结
开发语言·qt·svn
We་ct10 小时前
LeetCode 212. 单词搜索 II:Trie+DFS 高效解法
开发语言·算法·leetcode·typescript·深度优先·图搜索算法·图搜索
样例过了就是过了10 小时前
LeetCode热题100 路径总和 III
数据结构·c++·算法·leetcode·链表