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」!

C++ 学习笔记之——文件操作和文件流的更多相关文章
- Python学习笔记(三):文件和集合操作
python string与list互转 因为python的read和write方法的操作对象都是string.而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得 ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)
tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
续集请点击我:tensorflow学习笔记——使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录
Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator // ...
- vim学习笔记(1)——vim操作
仅记录一些自己最经常使用的vim操作.随时更新 文本操作 d 剪切.双击剪切一行 y 复制,双击复制一行 p 粘贴 x 删除当前光标下字符 r 替换当前光标字符.后面接替换的字符 :s/old/new ...
- jQuery学习笔记之DOM操作、事件绑定(2)
jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...
随机推荐
- 在cengos中安装zabbix server/agent, 并创建一个简单demo
添加zabbix更新源 rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch ...
- js关于密码框强弱度的提示
三种密码强度的正则表达式: 较弱:全是数字或全是字母 6-16个字符:/^[0-9]{6,16}$|^[a-zA-Z]{6,16}$/; 中级:数字.26个英文字母 6-16个字符: /^[A-Za- ...
- JavaScript 基础(二)数组
字符串, JavaScript 字符串就是用'' 和""括起来的字符表示. 字符字面量, \n 换行, \t 制表, \b 退格, \r 回车, \f 进纸, \\ 斜杠,\' 单 ...
- 爬虫——json模块与jsonpath模块
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与后 ...
- jquery图片滚动animate.css
@charset "UTF-8"; /*!Animate.css - http://daneden.me/animateLicensed under the MIT license ...
- 【super vlan的配置】
Super vlan的配置 一:根据项目需求搭建好拓扑图如下: 二:配置 1:由项目图进行理论分析:sw1属于三层交换,用于二层交换信息的转发;同时在sw1上可定义super vlan把sub vla ...
- 如何改变memcached默认的缓存时间?
我们在使用php的memcached的扩展来对memcached进行数据添加时,数据的有效时间有两种方式.如下图. 至于设置一个UNIX时间戳或 以秒为单位的整数(从当前算起的时间差)来说明 ...
- nginx2goaccess.sh脚本内容
脚本github地址:https://github.com/stockrt/nginx2goaccess/blob/master/nginx2goaccess.sh 脚本内容: #!/bin/bash ...
- Yaf学习(二)----Yaf初体验
1.hello world 1.1 用yaf输出hello world 1.首先配置host,nginx 2.host不用多说,指向虚拟机IP即可 1.2 重点说一下nginx (只说server块) ...
- 数据库中pymysql模块的使用
pymysql 模块 使用步骤: 核心类Connect链接用和Cursor读写用 1. 与数据库服务器建立链接 2. 获取游标对象(用于发送和接收数据) 3. 用游标执行sql语句 4. 使用fetc ...