当前位置: 首页 > 编程日记 > 正文

C++ 学习笔记之——文件操作和文件流

1. 文件的概念

对于用户来说,常用到的文件有两大类:程序文件和数据文件。而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件二进制文件

  • ASCII 文件,又称字符文件或者文本文件,它的每一个字节放一个 ASCII 代码,代表一个字符。
  • 二进制文件,又称内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。

数字 64 在内存中表示为 0100 0000,若将其保存为 ASCII 文件,则要分别存放十位 6 和个位 4 的 ASCII 码,为 0011 0110 0011 0100,占用两个字节;若将其保存为二进制文件,则按内存中形式直接输出,为 0100 0000,占用一个字节。

ASCII 文件中数据与字符一一对应,一个字节代表一个字符,可以直接在屏幕上显示或打印出来,这种方式使用方便,比较直观,便于阅读,但一般占用存储空间较大,而且输出时要将二进制转化为 ASCII 码比较花费时间。

二进制文件,输出时不需要进行转化,直接将内存中的形式输出到文件中,占用存储空间较小,但一个字节并不对应一个文件,不能直观显示文件中的内容。

2. 文件流和文件流对象

文件流是以外存文件未输入输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。

C++ 中有三个用于文件操作的文件类:

  • ifstream 类,它是从 istream 类派生来的,用于支持从磁盘文件的输入。
  • ofstream 类,它是从 ostream 类派生来的,用于支持向磁盘文件的输出。
  • fstream 类,它是从 iostream 类派生来的,用于支持对磁盘文件的输入输出。

要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者将磁盘文件输入到内存。

定义文件流对象后,我们还需要将文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件,并确定文件的工作方式(输入还是输出,二进制还是 ASCII)。我们可以在定义流对象的时候指定参数来调用构造函数,或者通过成员函数 open 来进行文件流对象和指定文件的关联。

3. 对 ASCII 文件的操作

然后,我们就可以用类似 cin 或者 cout 的方式将数据读出或写入文件,只不过是输入输出的对象变成了文件而已。当然,在对磁盘文件完成读写操作后,我们可以通过 close 方法来解除磁盘文件和文件流对象的关联。

#include <iostream>
#include <fstream>using namespace std;int main()
{ofstream outfile("a.txt", ios::out);if (!outfile){cerr << "Failed to open the file!";return 1;}// 写入数字 1-5 到文件中for (int i = 1; i < 6; i++){outfile << i << '\n';}outfile.close();ifstream infile("a.txt", ios::in);if (!infile){cerr << "Failed to open the file!";return 1;}char data;  // 从文件中读出数字 1-5 for (int i = 1; i < 6; i++){infile >> data;cout << data << '\n';}infile.close();return 0;
}

也可以利用文件流对象的成员函数 get, put 等,其用法就和 标准输入输出 介绍的一样。

int main()
{ofstream outfile("a.txt", ios::out);if (!outfile){cerr << "Failed to open the file!";return 1;}for (char i = '1'; i < '6'; i++){outfile.put(i); // 输出一个字符到文件中去}outfile.close();ifstream infile("a.txt", ios::in);if (!infile){cerr << "Failed to open the file!";return 1;}/*char a;for (int i = 0; i < 5; i++){infile.get(a); // 从文件中读出 1 个字符cout << a << '\n';}*/char data[5];infile.get(data, 6); // 从文件中读出 5 个字符for (int i = 0; i < 5; i++){cout << data[i] << '\n';}infile.close();return 0;
}

4. 对二进制文件的操作

二进制文件的操作需要在打开文件的时候指定打开方式为 ios::binary,并且还可以指定为既能输入又能输出的文件,我们通过成员函数 read 和 write 来读写二进制文件。

  • istream& read (char* s, streamsize n);
  • ostream& write (const char* s, streamsize n);
#include <iostream>
#include <fstream>using namespace std;int main()
{ofstream outfile("a.txt", ios::binary);if (!outfile){cerr << "Failed to open the file!";return 1;}char a[] = {'h', 'e', 'l', 'l', 'o', ','};char b[] = {'s', 'e', 'n', 'i', 'u', 's', 'e', 'n', '!'};outfile.write(a, 6); // 将以 a 为首地址的 6 个字符写入文件outfile.write(b, 9);outfile.close();ifstream infile("a.txt", ios::binary);if (!infile){cerr << "Failed to open the file!";return 1;}char data[6];infile.read(data, 6);  // 从文件中读出 6 个字符到以 data 为首地址的字符数组中for (int i = 0; i < 6; i++){cout << data[i];}char datb[6];infile.read(datb, 9);for (int i = 0; i < 9; i++){cout << datb[i];}infile.close();return 0;
}

在磁盘文件中有一个文件指针,用来指明当前读写的位置。每次写入或者读出一个字节,指针就向后移动一个字节。对于二进制文件,允许对指针进行控制,使它移动到所需的位置,以便在该位置上进行读写。

  • ostream& seekp (streampos pos); 将输出文件中指针移动到指定的位置
  • ostream& seekp (streamoff off, ios_base::seekdir way); 以参照位置为基准对输出文件中的指针移动若干字节
  • streampos tellp(); 返回输出文件指针当前的位置

  • istream& seekg (streampos pos); 将输入文件中指针移动到指定的位置
  • istream& seekg (streamoff off, ios_base::seekdir way); 以参照位置为基准对输入文件中的指针移动若干字节
  • streampos tellg(); 返回输入文件指针当前的位置

其中,参照位置有以下几个选择:

  • ios_base::beg 文件开始位置
  • ios_base::cur 文件当前位置
  • ios_base::end 文件末尾位置

获取更多精彩,请关注「seniusen」!
1240

转载于:https://www.cnblogs.com/seniusen/p/9957467.html

相关文章:

利用blktrace分析磁盘I/O

原文&#xff1a;https://blog.csdn.net/ygtlovezf/article/details/80528300 blktrace对于分析block I/O是个非常好的工具&#xff0c;本篇文章记录了如何使用blktrace。 blktrace原理 blktrace是对通用块层&#xff08;block layer&#xff09;的I/O跟踪机制&#xff0c;它…

shiro 同时实现url和按钮的拦截_一个“保存”按钮同时存在“增删改”三种操作,该如何去实现?...

一般情况下&#xff0c;对表格中的数据进行“增删改”操作&#xff0c;都是直接操作数据库。现在有些项目因为设计或者优化的缘故&#xff0c;不对表格中的数据进行“增删改”&#xff0c;而是通过最后“保存”按钮的操作&#xff0c;一次性将数据传至服务器&#xff0c;由服务…

在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址

在编写一些程序时&#xff0c;为了程序可以在其他电脑上也可以使用&#xff0c;而不用手动去更改ip,或者碰到端口不可用的情况。在这里找到了一个好的方法&#xff0c;实际使用也没有问题&#xff01;故此推荐给大家! 方案&#xff1a; 在构建网络时&#xff0c;使用&#xff1…

【翻译】ASP.NET WEB API异常处理

当一个web api抛出一个异常后 此异常会被转化成一个HTTP响应 错误代码为500的服务错误 但是如果你不想让客户端看到500的错误码 你也可以自定义错误码 如下代码当用户输入的ID没有与之相关的数据 则返回了错误码为404的错误 &#xff08;页面未找到&#xff09; public Product…

hook NtTerminateProcess进行应用的保护

这段时间在学习驱动&#xff0c;然后看到hook ssdt的代码&#xff0c;找了一个写的清晰的学习了一下&#xff1a;http://www.netfairy.net/?post218 这里是hook NtOpenProcess&#xff0c;但是想自己练手所以hook NtTerminateProcess&#xff0c;经过多次蓝屏后&#xff0c;然…

linux系统 长久记录所有用户所有操作记录

在linux系统中想要记录所有登录过当前系统的用户操作&#xff0c;排查有人对当前系统做的何种操作导致系统问题&#xff0c;可以按照如下方法进行。 前言 在描述操作步骤之前&#xff0c;先说一下系统环境变量的相关配置文件 ~/.bashrc和~/.bash_file&#xff0c;这两个文件…

jquery图片播放切换插件

点击这里查看效果可自定义数字样式和左右点击按钮这个更好&#xff1a;移入按钮切换版本更多图片轮播以下是HTML文件代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti…

安卓饼状图设置软件_话单及银行卡交易智能分析软件

一、产品概况&#xff1a; 思迈奥SMILE数据智能分析软件是由我司自主设计与研发的一款结合在公安和检察院的侦查业务经验而定制研发的数据智能分析系统&#xff0c;包含于话单、电子银行账单、及其它数据(个人出行数据、社会资源数据、微信数据及其它聊天数据)等的数据导入、检…

跨区域MPLS TE

拓扑&#xff1a; R1配置&#xff1a; mpls label range 100 199 mpls traffic-eng tunnels interface Loopback0 ip address 192.168.1.1 255.255.255.255 ! interface Tunnel1 ip unnumbered Loopback0 tunnel mode mpls traffic-eng tunnel destination 192.168.1.4 tunnel …

C++智能指针: shared_ptr 实现详解

文章目录shared_ptr描述声明作用原理实现函数使用关于shared_ptr循环引用问题shared_ptr描述 声明 shared_ptr属于C11特性中新加的一种智能指针&#xff0c;它的实现方式是模版类&#xff0c;头文件<memory> template <class T> class shared_ptr 所以使用shared…

linux文本处理常用命令

linux文本处理常用命令 linux文本处理命令&#xff1a;grep、sed、printf、awk 1.grep grep的作用是按行查找字符&#xff0c;输出包含字符的行。 #从文件查询 grep hello filename.txt #从管道的输入查询 cat filename.txt|grep hello grep使用示例&#xff1a; grep的查找主要…

arduino 控制无刷电机_智能控制轮椅来了,残疾人的福音!

传统的轮椅已被证明是非常宝贵的工具&#xff0c;为残疾人提供了很多便利&#xff0c;但其只能限制坐在一个位置。外国的一个研究团队通过开发一个功能强大的多功能轮椅&#xff0c;使用户能够通过手机应用程序轻松地在各种各样的位置之间进行切换。(图片来自 IC photo)这是一种…

python科学计算整理

网站&#xff1a; http://bokeh.pydata.org/gallery.html 转载于:https://www.cnblogs.com/gogly/p/3453341.html

TP-link 841N 刷DD-WRT固件

2012年4月20号 今天&#xff0c;笔者逛“太平洋”的时候&#xff0c;发现了一个关于TP-Link 840N刷DD-WRT的帖子&#xff0c;进去逛了一会&#xff0c;突然记得自己家中的那个路由好像也是这个型号的&#xff0c;二话不说&#xff0c;果断收录这条资料&#xff0c;并把所需要的…

网格的铺设问题——骨牌

Problem Description 有一个大小是 2 x n 的网格&#xff0c;现在需要用2种规格的骨牌铺满&#xff0c;骨牌规格分别是 2 x 1 和 2 x 2&#xff0c;请计算一共有多少种铺设的方法。 Input 输入的第一行包含一个正整数T&#xff08;T<20&#xff09;&#xff0c;表示一共有 T…

C++智能指针:weak_ptr实现详解

文章目录weak_ptr描述声明作用原理实现函数成员使用总结weak_ptr描述 声明 头文件&#xff1a;<memory> 模版类&#xff1a;template <class T> class weak_ptr 声明方式&#xff1a;std::weak_ptr<type_id> statement 作用 根据boost库的官方描述&#…

在PHP中使用全局变量的几种方法

简介即使开发一个新的大型PHP程序&#xff0c;你也不可避免的要使用到全局数据&#xff0c;因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有&#xff1a;程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据&#xff0c;其中最常…

python处在哪个阶段_python 基础复习

1、简述cpu、内存、硬盘的作用cpu(1)cpu&#xff1a;处理逻辑运算、算术运算(2)cpu&#xff1a;接受指令传给电脑硬件&#xff0c;让其运行内存&#xff1a;(1)内存&#xff1a;从硬盘中读取数据&#xff0c;供其cpu调取指令运行&#xff0c;短暂的存贮数据&#xff1b;运行速度…

android用户界面之WebView教程实例汇总

一、WebView教程1.Android---UI篇---WebView&#xff08;网络视图&#xff09;http://www.apkbus.com/android-14259-1-1.html2.webview学习记录http://www.apkbus.com/android-44567-1-1.html3.Android中使用WebView, WebChromeClient和WebViewClient加载网页http://www.apkbu…

java下输出中文的一点研究

网上或者大部分书上都说Java中输出中文使用FileReader类就可以了&#xff0c;但是当你读取一个中文文档时&#xff0c;你会发现&#xff0c;除了乱码&#xff0c;还是乱码。究其原因&#xff0c;这其实是文件流读取时使用的编码方式和文件本身编码方式不同,造成读取出来文件乱码…

C++智能指针:unique_ptr详解

文章目录unique_ptr描述声明作用函数指针描述总结unique_ptr描述 声明 头文件&#xff1a;<memory> 模版类&#xff1a; 默认类型template <class T, class D default_delete<T>> class unique_ptr数组类型template <class T, class D> class uniq…

川崎机器人示教盒维修_专业维修丹阳市KUKA库卡KRC2库卡C4主板维修{苏州罗韦维修}...

发那科机器人故障分析 发那科伺服放大器上LED指示灯故障维修大全_发那科机器人维修&#xff0c;FANUC机器人保养&#xff0c;伺服电机示教器减速器维修&#xff0c;驱动器维修&#xff0c;苏州发那科机器人维修&#xff0c;本文主要介绍了发那科伺服放大器上因故障而出现的各种…

js 文本反向排列显示

一次面试遇到这样的题目 反向输出“how are you” 解决方法 <script language"JavaScript">var message1"how are you";var message2"";for (countmessage1.length; count > 0; count--)message2message1.substring(count,count-1);doc…

2012年12月4期手机网页开发

最近主要做手机上页面的开发&#xff0c;主要框架是&#xff0c;手机安装客户端&#xff0c;加载主站手机应用页面&#xff0c;手机客户端配合主站功能实现本地扫描或重力感应的效果。 针对安卓系统&#xff0c;在开发和调试时发现如下问题&#xff1a;1路径错误&#…

zabbix4.0构建实录

【Nginx】 #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [rootcentos ~]# yum -y install zlib pcre pcre-devel openssl openssl-devel[rootcentos ~]# useradd -s /sbin/nologin nginx [rootzabbix-server ~]# yum install -y nginx 【M…

ceph-kvstore-tool 工具使用详解

文章目录简介使用总结简介 ceph-kvstore-tool工具是用来获取存放在leveldb或者rocksdb数据库中的键值元数据。并且该工具能够对kvstore中的数据进行配置&#xff0c;就像是对离线后的osd操作osd map一样 使用该工具&#xff0c;需要安装ceph-test-12.2.1.06-0.el7.centos.x86_…

springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

一、前言在某些情况下&#xff0c;由于网速慢&#xff0c;用户操作有误(连续点击两下提交按钮)&#xff0c;页面卡顿等原因&#xff0c;可能会出现表单数据重复提交造成数据库保存多条重复数据。存在如上问题可以交给前端解决&#xff0c;判断多长时间内不能再次点击保存按钮&a…

智能会议白板系统每日开发记录

智能会议白板系统&#xff0c;在开发过程中&#xff0c;整个项目期限内&#xff0c;每月&#xff0c;每周&#xff0c;每天要做的事情&#xff0c;作为组长的记录&#xff0c;多有不足之处&#xff0c;望指点。 转载于:https://www.cnblogs.com/mayijun/p/3458039.html

java.lang.OutOfMemoryError: PermGen space及其解决方法

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出&#xff0c;解决方法也一定是加大内存。说说为什么会内存益出&#xff1a;这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入Per…

ceph-dencoder工具使用详解

文章目录简介使用decode命令用法encode简介 ceph-dencoder工具是一个序列化编码、解码并且打印ceph数据结构的工具。它主要用来调试和测试ceph不同版本之间的兼容性问题 该工具是由 ceph-common-12.2.1.06-0.el7.centos.x86_64 rpm包生成 本文章是根据ceph-12.2.1版本来描述改…