文件操作

一、文件的分类

  • 文本文件:以文本的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. 爬虫之xml和html的区别
  2. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password
  3. 文件编码和RandomAccessFile文件流的使用--IO学习笔记(一)
  4. Python自动运维系列:每天凌晨定时执行特定任务
  5. 图书馆用文本文件booklist.txt记录图书的书目,其中包括book1,book2,.....,book10.现在又要采购一批新书,编写程序将新的书目添加到目录中。
  6. HDU1240 POJ2225 Asteroids!【BFS】
  7. php mysql mysql_set_charset()._PHP:MySQL函数mysql_set_charset()的用法
  8. php openssl.so加载,LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)...
  9. VRay4.2 for 3dsMax2013-2020
  10. 主成分分析结果成分不显著_spss主成分分析结果解读
  11. 杨霖演讲实录∣从模块化架构到跨链生态,NULS这一年下了一盘怎么样的棋
  12. c++快速傅里叶变换、反变换(FFT、IFFT)
  13. 电脑桌面图标右上角出现计算机名称如何取消,电脑桌面上的图标名称怎么清除不显示?...
  14. 赠人玫瑰,手有余香,今日份黑科技软件五款奉上
  15. 2020大学研究生计算机排名,美国大学研究生计算机专业排名2020情况如何?
  16. 爱奇艺再发行6亿美元可转债:债务问题基本解决 将轻装上阵
  17. Kubernetes---Secret配置管理
  18. Unix和Linux之间的区别?什么是bash?常用的linux命令
  19. JS之splice和slice函数
  20. Spring入门示例

热门文章

  1. 客户成功案例 | 台湾杜邦:提升制程能力的法宝 — 先进的数据分析
  2. 汽车电子开发设计常用软件工具有哪些
  3. 车载双目相机,老兵的二次出征
  4. 管理系统项目-简历描述篇
  5. RSA攻击手法及相应例题解析
  6. Android6,androidstudio游戏开发教程
  7. Tapestry5杂谈
  8. 信息处理技术员下午考试试题分析
  9. 服务器延迟和时间偏移怎么设置,服务器时间经常不对如何处理
  10. 利用Tushare下载多个股票数据并进行数据处理以及数据合并