在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 get() 和 put() 成员方法实现。

C++ ostream::put()成员方法

通过《C++ cout.put()》一节的学习,读者掌握了如何通过执行 cout.put() 方法向屏幕输出单个字符。我们知道,fstream 和 ofstream 类继承自 ostream 类,因此 fstream 和 ofstream 类对象都可以调用 put() 方法。

当 fstream 和 ofstream 文件流对象调用 put() 方法时,该方法的功能就变成了向指定文件中写入单个字符。put() 方法的语法格式如下:

ostream& put (char c);

其中,c 用于指定要写入文件的字符。该方法会返回一个调用该方法的对象的引用形式。例如,obj.put() 方法会返回 obj 这个对象的引用。

举个例子:

#include

#include

using namespace std;

int main()

{

char c;

//以二进制形式打开文件

ofstream outFile("out.txt", ios::out | ios::binary);

if (!outFile) {

cout << "error" << endl;

return 0;

}

while (cin >> c) {

//将字符 c 写入 out.txt 文件

outFile.put(c);

}

outFile.close();

return 0;

}

执行程序,输入:

http://c.biancheng.net/cplus/↙

^Z↙

其中,↙表示输入换行符;^Z是 Ctrl+Z 的组合键,表示输入结束。

由此,程序中通过执行 while 循环,会将 "http://c.biancheng.net/cplus/" 字符串的字符逐个复制给变量 c,并逐个写入到 out.txt 文件。

注意,由于文件存放在硬盘中,硬盘的访问速度远远低于内存。如果每次写一个字节都要访问硬盘,那么文件的读写速度就会慢得不可忍受。因此,操作系统在接收到 put() 方法写文件的请求时,会先将指定字符存储在一块指定的内存空间中(称为文件流输出缓冲区),等刷新该缓冲区(缓冲区满、关闭文件、手动调用 flush() 方法等,都会导致缓冲区刷新)时,才会将缓冲区中存储的所有字符“一股脑儿”全写入文件。

C++ istream::get()成员方法

和 put() 成员方法的功能相对的是 get() 方法,其定义在 istream 类中,借助 cin.get() 可以读取用户输入的字符。在此基础上,fstream 和 ifstream 类继承自 istream 类,因此 fstream 和 ifstream 类的对象也能调用 get() 方法。

当 fstream 和 ifstream 文件流对象调用 get() 方法时,其功能就变成了从指定文件中读取单个字符(还可以读取指定长度的字符串)。值得一提的是,get() 方法的语法格式有很多(请猛击这里了解详情),这里仅介绍最常用的 2 种:

int get();

istream& get (char& c);

其中,第一种语法格式的返回值就是读取到的字符,只不过返回的是它的 ASCII 码,如果碰到输入的末尾,则返回值为 EOF。第二种语法格式需要传递一个字符变量,get() 方法会自行将读取到的字符赋值给这个变量。

本节前面在讲解 put() 方法时,生成了一个 out.txt 文件,下面的样例演示了如何通过 get() 方法逐个读取 out.txt 文件中的字符:

#include

#include

using namespace std;

int main()

{

char c;

//以二进制形式打开文件

ifstream inFile("out.txt", ios::out | ios::binary);

if (!inFile) {

cout << "error" << endl;

return 0;

}

while ( (c=inFile.get())&&c!=EOF ) //或者 while(inFile.get(c)),对应第二种语法格式

{

cout << c ;

}

inFile.close();

return 0;

}

程序执行结果为:

http://c.biancheng.net/cplus/

注意,和 put() 方法一样,操作系统在接收到 get() 方法的请求后,哪怕只读取一个字符,也会一次性从文件中将很多数据(通常至少是 512 个字节,因为硬盘的一个扇区是 512 B)读到一块内存空间中(可称为文件流输入缓冲区),这样当读取下一个字符时,就不需要再访问硬盘中的文件,直接从该缓冲区中读取即可。

C语言中get_put函数详解,C++ get()和put()读写文件详解相关推荐

  1. C语言中get_put函数详解,C语言第五课之getchar函数和putchar函数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 getchar函数也就是键盘输入函数,这个函数和scanf函数不一样!getchar函数没有scanf函数灵活.下面就给大家介绍下getchar函数的介绍 ...

  2. c语言time函数的作用,c语言中time函数的用法

    c语言中time函数的用法 c语言中time函数的用法的用法你知道吗?下面应届毕业生小编就跟你们详细介绍下c语言中time函数的用法的用法,希望对你们有用. c语言中time函数的用法的用法如下: 头 ...

  3. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  4. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  5. php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...

    详解C语言中telldir()函数和seekdir()函数的用法 C语言telldir()函数:取得目录流的读取位置头文件: #include 定义函数: off_t telldir(DIR *dir ...

  6. c语言rand函数的作用,详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的ran ...

  7. c语言中argc的作用,C语言中 int main(int argc,char *argv[])的两个参数详解

    C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数: argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数.命令行后面 ...

  8. r语言中c函数错误,R语言中c()函数与paste()函数的区别说明

    c()函数:将括号中的元素连接起来,并不创建向量 paste()函数:连接括号中的元素 例如 c(1, 2:4),结果为1 2 3 4 paste(1, 2:4),结果为"1 2" ...

  9. C语言中malloc函数及free函数用法(定义动态数组及释放)

    一.关于静态数组.动态数组 二.malloc()和free()的基本概念以及基本用法 1.函数定义 2.函数用法 3.关于函数使用注意事项 三.malloc()函数分配内存空间的由来 四.malloc ...

最新文章

  1. 深入理解Spring系列之三:BeanFactory解析
  2. ABAP memory中的Export和Import
  3. 踩坑日记:Logstash同步数据库有type字段导致同步失败
  4. 如何用stata画莫兰散点图_吃下这颗安利:STATA
  5. [转载]超酷代码-使用 ASP.NET AJAX 进行拖放
  6. android 判断app处于前后台
  7. session对象和applicatione对象
  8. LeetCode 105. 从前序与中序遍历序列构造二叉树(递归)
  9. DataTable转成字符串复制到txt文本
  10. 简单循迹小车实验心得_循迹小车实训报告
  11. 极乐净土歌词-罗马音
  12. 119、交换机基本配置命令
  13. Linux 下串口编程入门
  14. 解决webview无法调用支付宝
  15. java 假币问题_减治法解决假币问题
  16. 追本溯源,回归根本:第一届区块链技术及应用峰会(BTA)·中国“区块链核心技术”分论坛预告大放送...
  17. 廊坊金彩教育:店铺运营技巧思路
  18. 数据库专辑--SQL分类汇总(group by...with rollup),增加“总计”字段
  19. java语言实现吃水果问题_Java 面向对象 之 人吃水果
  20. 管理计算机域的内置账户怎么取消,取消普通域用户将计算机加入域的权限

热门文章

  1. 计算机电路板 接地,PCB的接地设计,每一个工程师都应该掌握
  2. 计算机插入U盘意外重启,VMware虚拟机不能启动
  3. shell 浮点数运算bc
  4. 智能计算系统(学习笔记)-第二章神经网络
  5. CSS_3th_div+CSS布局
  6. 一场特殊的“巴展”,华为的十年踪迹十年心
  7. 面向对象程序设计·学习笔记(1/2)
  8. 在Qt中设置鼠标光标形状的方法介绍
  9. Mat::create
  10. 3.2 网络节点架构