C语言中get_put函数详解,C++ get()和put()读写文件详解
在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用 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()读写文件详解相关推荐
- C语言中get_put函数详解,C语言第五课之getchar函数和putchar函数
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 getchar函数也就是键盘输入函数,这个函数和scanf函数不一样!getchar函数没有scanf函数灵活.下面就给大家介绍下getchar函数的介绍 ...
- c语言time函数的作用,c语言中time函数的用法
c语言中time函数的用法 c语言中time函数的用法的用法你知道吗?下面应届毕业生小编就跟你们详细介绍下c语言中time函数的用法的用法,希望对你们有用. c语言中time函数的用法的用法如下: 头 ...
- c语言memcopy_C语言中memcpy 函数的用法详解
C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
- php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...
详解C语言中telldir()函数和seekdir()函数的用法 C语言telldir()函数:取得目录流的读取位置头文件: #include 定义函数: off_t telldir(DIR *dir ...
- c语言rand函数的作用,详解C语言中rand函数的使用
前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的ran ...
- c语言中argc的作用,C语言中 int main(int argc,char *argv[])的两个参数详解
C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数: argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数.命令行后面 ...
- r语言中c函数错误,R语言中c()函数与paste()函数的区别说明
c()函数:将括号中的元素连接起来,并不创建向量 paste()函数:连接括号中的元素 例如 c(1, 2:4),结果为1 2 3 4 paste(1, 2:4),结果为"1 2" ...
- C语言中malloc函数及free函数用法(定义动态数组及释放)
一.关于静态数组.动态数组 二.malloc()和free()的基本概念以及基本用法 1.函数定义 2.函数用法 3.关于函数使用注意事项 三.malloc()函数分配内存空间的由来 四.malloc ...
最新文章
- 深入理解Spring系列之三:BeanFactory解析
- ABAP memory中的Export和Import
- 踩坑日记:Logstash同步数据库有type字段导致同步失败
- 如何用stata画莫兰散点图_吃下这颗安利:STATA
- [转载]超酷代码-使用 ASP.NET AJAX 进行拖放
- android 判断app处于前后台
- session对象和applicatione对象
- LeetCode 105. 从前序与中序遍历序列构造二叉树(递归)
- DataTable转成字符串复制到txt文本
- 简单循迹小车实验心得_循迹小车实训报告
- 极乐净土歌词-罗马音
- 119、交换机基本配置命令
- Linux 下串口编程入门
- 解决webview无法调用支付宝
- java 假币问题_减治法解决假币问题
- 追本溯源,回归根本:第一届区块链技术及应用峰会(BTA)·中国“区块链核心技术”分论坛预告大放送...
- 廊坊金彩教育:店铺运营技巧思路
- 数据库专辑--SQL分类汇总(group by...with rollup),增加“总计”字段
- java语言实现吃水果问题_Java 面向对象 之 人吃水果
- 管理计算机域的内置账户怎么取消,取消普通域用户将计算机加入域的权限