文件操作

一、文件的分类

  • 文本文件:以文本的ASCII码形式存储在计算机中
  • 二进制文件:以文本的二进制形式存储在计算机中
    操作文件有三个类:
    1、ofstream 写操作
    2、ifstream 读操作
    3、fstream 读写操作

二、文本文件

(一)写文件
读文件有以下步骤:
1、注意要包含头文件

#include<fstream>

2、创建流对象

ofstream ofs;

3、打开文件

ofs.open("文件路径",打开方式);

文件打开方式有这几种:

打开方式 解释
ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件再创建
ios::binary 二进制方式

4、写数据

ofs<<"写入的数据";

5、关闭文件

ofs.close();

注意:文件打开方式是可以组合起来使用的,只要利用 | 操作符就可以了
如:用二进制方式写文件 ios::binary | ios::out

#include<iostream>
using namespace std;
#include<fstream>//头文件包含//文本文件 写文件void test01() {//1、包含头文件 fstream//2、创建流对象ofstream ofs;//3、指定打开方式ofs.open("test.txt", ios::out);//4、写内容ofs << "姓名:张三" << endl;ofs << "性别:男" << endl;ofs << "年龄:18" << endl;//5、关闭文件ofs.close();
}int main() {test01();system("pause");return 0;
}

此时没有写文件路径,那么默认的就是创建在所在项目同级的目录下

打开test.txt文件,可以看到里面的内容:

(二)读文件
写文件有以下步骤:
1、注意要包含头文件

#include<fstream>

2、创建流对象

ifstream ifs;

3、打开文件,并判断文件是否打开成功

ifs.open("文件路径",打开方式);

4、读数据

四种方式读取

  • 第一种:定义一个字符数组buf[1024],全部初始化为0,然后用这个字符数组来接收读到的数据。再使用ifs >> buf,这个就像cin一样,可以看做是输入
 char buf[1024] = { 0 };while (ifs >> buf) {//一行一行读取cout << buf<<endl;}
  • 第二种:也是用字符数组来接收读到的数据,不过用到的是ifs.getline(buf, sizeof(buf)),这个是ifstream的类对象ifs中含有的成员函数getline(),第一个参数是字符数组的首地址,第二个参数是大小
 char buf[1024] = { 0 };while (ifs.getline(buf, sizeof(buf))) {cout << buf << endl;}
  • 第三种:使用全局函数istream&getline(istream& is, string& str),功能是将流 istream& is 中的字符串存到string& str 当中去
 string buf;while( getline(ifs,buf)) {cout << buf << endl;}
  • 第四种:一个字符一个字符地读,这种不推荐使用。c = ifs.get()) != EOF
    其中 EOF 就是end of flie
 char c;while((c = ifs.get()) != EOF) {//一个字符一个字符读到字符c中,判断下是否读到文件尾了,如果没有读到文件尾,则一直读cout << c;}

5、关闭文件

ifs.close();

完整代码如下:

#include<iostream>
using namespace std;
#include<fstream>
#include<string>//文本文件 读文件
void test01() {//1、包含头文件#include<fstream>//2、创建流对象ifstream ifs;//3、打开文件 并判断文件是否打开成功ifs.open("test.txt", ios::in);//打开方式 读if (!ifs.is_open()) {cout << "文件打开失败!" << endl;return;}//4、读数据//第一种//char buf[1024] = { 0 };//定义一个字符数组 初始化为0 用字符数组来接收读到的数据//while (ifs >> buf) {//一行一行读取// cout << buf<<endl;//}//第二种//char buf[1024] = { 0 };//while (ifs.getline(buf, sizeof(buf))) {//ifstream的类对象ifs中含有成员函数getline函数,可以将TXT文件中的内容一行一行的读取,每次读取之后将内容存入buf中。//   cout << buf << endl;//}//第三种//string buf;//while( getline(ifs,buf)) {//全局函数getline,将输入流ifs作为函数参数传入getline中,并且将读取的数据存在之前就创建好的数组字符串变量buf中// cout << buf << endl;//}//第四种(不推荐)char c;while((c = ifs.get()) != EOF) {//一个字符一个字符读到字符c中,判断下是否读到文件尾了,如果没有读到文件尾,则一直读cout << c;}//5、关闭文件ifs.close();
}int main() {test01();system("pause");return 0;
}

运行结果为:

三、二进制文件
如果要以二进制的方式对文件进行读写操作,那么打开方式要指定为ios::binary
(一)写文件
打开方式指定为ios::out | ios::binary
通过ofstream和ostream 类的write 成员函数将二进制数据写入文件
write(addressOfBuffer, numberOfBytes),第一个参数是缓冲区的地址,第二个参数是字节数。但是还有一个问题,就是缓冲区中的数据可能是整型、浮点型等等,而这个write成员函数并不会区分这些,只会把缓冲区看成是一个字节数组,因为 C++ 不支持指向字节的指针,因此 write 函数将指定缓冲区的地址是指向 char 的指针,在实际使用时,对原本的指针进行强制类型转换就行了,也就是这样:
write(char *addressOfBuffer, int numberOfBytes);

#include<iostream>
using namespace std;
#include<fstream>//二进制文件 写文件
class Person
{public:char mName[64];//姓名int mAge;//年龄
};void test01() {//1、包含头文件#include<fstream>//2、创建流对象ofstream ofs;//3、打开文件ofs.open("person.txt", ios::out | ios::binary);//4、写文件Person p = { "张三",18 };ofs.write((const char*)&p, sizeof(Person));//如果直接对p取地址,则是一个Person型,要强制转成const char型//5、关闭文件ofs.close();}int main() {test01();system("pause");return 0;
}

可见 文件夹中已经多了person.txt这个文件

(二)读文件
打开方式指定为ios::in | ios::binary
利用成员函数read(char *addressOfBuffer, int numberOfBytes)来读文件

#include<iostream>
using namespace std;
#include<fstream>class Person
{public:char mName[64];int mAge;
};void test01() {//1、包含头文件#include<fstream>//2、创建流对象ifstream ifs;//3、打开文件,并判断文件是否打开成功ifs.open("person.txt",ios::in|ios::binary);if (!ifs.is_open()) {cout << "文件打开失败!" << endl;return;}//4、读文件Person p;ifs.read((char*)&p, sizeof(p));cout << "姓名: " << p.mName << " 年龄: " << p.mAge << endl;//5、关闭文件ifs.close();
}int main() {test01();system("pause");return 0;
}

运行结果为:

已经正确显示数据

【b站黑马程序员C++视频学习笔记-文件操作】相关推荐

  1. 【b站黑马程序员C++视频学习笔记-继承方式】

    继承方式 有以下三种继承方式: 公共继承public 保护继承protected 私有继承private 继承之后访问权限如下: 类名/属性 int a int b int c 父类A public ...

  2. 【b站黑马程序员C++视频学习笔记-多态案例三-电脑组装】

    多态案例三-电脑组装 电脑主要组成部件为CPU(用于计算),显卡(用于显示),内存条(用于存储).把每个零件封装出抽象父类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商.创建 ...

  3. 【b站黑马程序员C++视频学习笔记-多态案例二-制作饮品】

    多态案例二-制作饮品 利用多态实现制作咖啡和茶水 Coffee和Tea继承了抽象类AbstractDrinking,并重写了AbstractDrinking的抽象函数 #include<iost ...

  4. 尚硅谷+黑马程序员MongoDB视频学习笔记(一)

    本学习笔记是来源于学习B站上的尚硅谷和黑马的MongoDB教学视频而做的知识总结. 一.数据库(Database) 数据库是按照数据结构来组织.存在和管理数据的仓库.说白了,数据库就是存在数据的仓库. ...

  5. 黑马程序员 c++视频学习详细笔记 下载地址

    黑马程序员 c++视频学习详细笔记 下载地址: https://download.csdn.net/download/m0_47891203/84348174 建议结合博主博文学习

  6. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  7. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

  8. 黑马程序员_java自学学习笔记(八)----网络编程

    黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...

  9. 【黑马程序员新版Linux学习笔记】Linux系统实用操作命令——操作演示

    [黑马程序员新版Linux学习笔记]Linux 零基础快速入门: (一)Linux基本命令--操作演示 (二)Linux用户和权限 -- 操作演示 (三)Linux 小技巧快捷键 (四)Linux系统 ...

  10. b站黑马程序员python基础学习

    python的安装 第一个python程序 打开CMD(命令提示符)程序,输入Python并回车 然后,在里面输入代码回车即可立即执行 Python 解释器 我们可以将代码,写入一个以".p ...

最新文章

  1. 2021-06-05
  2. Java 的toString() 和 equals()函数简单介绍
  3. java顺序结构类型,Java类的完整构造执行顺序
  4. CL_CRM_REPORT_QUESTION call CRM_REPORT_RF_CHECK_AUTHORITY
  5. php curl发送post请求失败,php 利用curl发送post请求
  6. 计算机视觉招聘_INDEMIND|SLAM、计算机视觉、深度学习算法招聘(社招实习)
  7. POJ_1088 滑雪(记忆型DP+DFS)
  8. 洛谷 P2257 YY的GCD
  9. 用安卓设备通过otg完成电脑启动盘装机盘的制作,通过手机在U盘写入iso镜像
  10. 如何设计网页模板才简洁美观?
  11. 视频主观质量评价方法总结
  12. 智能时代“无人区”的开拓者,国防科大智能科学学院推免生源大起底
  13. 蓝桥杯每日一练----字符串逆序
  14. 树状数组(Binary Indexed Tree),看这一篇就够了
  15. 3步实现神经机器翻译模型处理
  16. LoRaEdge LR1120 卫星直连通信解读
  17. Windows系统解决谷歌翻译不能用的问题
  18. 解决google浏览器无法自动播放音视频问题
  19. 北方工业大学数据结构考研
  20. 市政下水道疏通机器人_疏通市政管道 机器人管道检测 好用的疏通下水道

热门文章

  1. 阿卜杜拉国王科技大学Vision-Cair组招收计算机视觉博士后Scientist和访问学者等...
  2. Mppt光伏最大功率点跟踪控制matlab仿真
  3. 【电子科技大学-微电子技术导论】学习笔记
  4. 《电子数据取证》读书笔记-第一章
  5. 百度文库免费下载,精选六种方法!
  6. 软考初级信息处理技术员(一)
  7. 为什么“隐性知识”比“刻意练习”更重要?
  8. 字符串函数和数据类型转换函数
  9. 《深入浅出统计学》之统计学知识小结
  10. MFC之学习绘制矩形、画刷使用