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;
}

总结:

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

相关推荐
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯