文件与流(C++)

  • 六、文件与流
    • 6.1 IO流库概念
    • 6.2 istream 与 ostream
      • 6.2.1 istream
      • 6.2.2 ostream
      • 6.2.3 输入输出的格式控制
    • 6.3 string流
    • 6.4 文件流

六、文件与流

6.1 IO流库概念

C++建立了一个十分庞大的流类库来实现数据的输入输 出操作。其中的每个流类实现不同的功能,这些类通过 继承组合在一起。

在这里插入图片描述

streambuf主要作为其他类的支持,定义了对缓冲区的 通用操作,如设置缓冲区、从缓冲区中读取数据,写入 数据等操作。

在这里插入图片描述

为了便于程序数据的输入输出,C++预定义了几个标准 输入输出流对象:

cout: ostream cout, 与标准输出设备关联

cin: istream cin, 与表示输入设备关联

cerr: ostream cerr, 与标准错误设备关联(非缓冲方 式)

clog: ostream clog, 与标准错误设备关联(缓冲方式)

6.2 istream 与 ostream

6.2.1 istream

#include <iostream>
using namespace std;int main(void){char a[100] = {0};/* * 从标准输出设备输出* */cout << "Please input a string: " ;/* 从标准输入设备接受 放到 a 当中去* 遇到空格就结束* */cin >> a;							 cout << a << endl;return 0;
}//输出结果
myubuntu@ubuntu:~/lv19/cplusplus/dy08$ ./a.out 
Please input a string: 12 34
12

istream类定义了许多用于从流中提取数据和操作文件的成员函数,并对流的析取运算符 >> 进行了重载,实现了对内置数据量(基本数据类型)的输入功能。其中常用的几个成员函数时 get、getline、read、ignore.

get( char_type& ch); //从输入流中提取一个字符(包括空白符)
//一次性读取一行字符
getline( char_type* s, std::streamsize count, char_type delim );
//从输入流一次性读取count个字符
read( char_type* s, std::streamsize count );
//从输入流中读取字符并丢弃
ignore( std::streamsize count = 1, int_type delim = Traits::eof() );
#include <iostream>
using namespace std;int main(void){char a[100] = {0};char c;/* * 从标准输出设备输出* */cout << "Please input a string: " ;/* 从标准输入设备接受 放到 a 当中去* 遇到空格就结束* */
//	cin >> a;							 cin.getline(a, 100); //遇到空格就不会结束了 可以自定义结束符cout << a << endl;/** 从输入设备接收单个字符 存放到c字符变量当中 并循环输出* */cout << "use get(); please input char: " << endl;while ((c = cin.get()) != '\n') cout << c ;cout << endl;/** 从标准输入设备接受5个字符 并放到a数组当中* */cout << "use get(a, 5) : " << endl;cin.get(a, 5);cout << a << endl;return 0;
}

6.2.2 ostream

ostream类提供了许多用于数据输出的成员函数,并通过流的输出<<重载,实现了对内置数据类型的输出功能。其中几个常用的成员函数时put、write、flush.

put( char_type ch ); //插入一个字符到输出流
write( const char_type* s, std::streamsize count );//插入一个字符序列到输出流中
flush(); //刷新输出流
#include <iostream>
#include <cstring>
using namespace std;int main(void){char a[100] = "哈喽";cout << "word" << endl;cout.put('h').put('e').put('l').put('l').put('o').put('\n');cout.write(a, strlen(a));return 0;
}

6.2.3 输入输出的格式控制

C语言中可以使用scanf() 和 printf() 实现数据的格式化输入输出,C++中利用ios类的格式控制成员函数或者操纵符进行输入,输出数据的格式化。

  • 操纵符(全局函数)

    输入/输出操纵符 (gitee.io)

    在这里插入图片描述

    #include <iostream>
    #include <iomanip>
    using namespace std;int main(void) {cout << 10/3.0 << endl;cout << setprecision(10) << 10/3.0 << endl; //输出精度为10cout << setw(5) << 10 << endl; //右对齐 宽度为5个字符cout << setw(5) << setfill('0') << 123 << endl; //空白地方填充字符 0return 0;
    }
    //输出结果
    myubuntu@ubuntu:~/lv19/cplusplus/dy08$ ./a.out 
    3.33333
    3.33333333310
    00123
    
  • 成员函数

    std::basic_ostream (gitee.io)

    在这里插入图片描述

    #include <iostream>
    #include <iomanip>
    using namespace std;int main(void) {cout << 10/3.0 << endl;//cout << setprecision(10) << 10/3.0 << endl; //输出精度为10cout.precision(10); //输出精度为10cout << 10/3.0 << endl;cout << setw(8) << left << setfill('0') << hex << showbase << 123 <<endl;return 0;
    }
    myubuntu@ubuntu:~/lv19/cplusplus/dy08$ ./a.out 
    3.33333
    3.3333333330x7b
    

6.3 string流

std::istrstream (gitee.io)

在这里插入图片描述

istrstream和ostrstream在98标准中废弃,取而代之的是istringstream和ostringstream,实现类似于C语言中sprint和sscanf的效果,不是在标准输入设备中获取数据,操作对象是在缓冲区。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
using namespace std;int main(void) {int i = 10;double j = 3.14;char s[] = "hello";/*char buf[100] = {0};sprintf(buf, "%d %lf %s", i, j, s);printf("%s\n", buf);char str[] = "12 4.15 world";sscanf(str, "%d %lf %s", &i, &j, s);printf("%d %lf %s\n", i, j, s);
*/ostringstream oss;oss << i << ' ' << j << ' ' << s ;cout << oss.str() << endl;istringstream iss;iss.str("46 6.54 leep");iss >> i >> j >> s ;cout << i << "," << j << ", " << s << endl;return 0;
}
myubuntu@ubuntu:~/lv19/cplusplus/dy08$ ./a.out 
10 3.14 hello
46,6.54, leep

6.4 文件流

C++将文件看成是一个个字符在磁盘上的有序集合,用流来实现文件的读写操作。C++中用来建立流对象的类有ifstream(输入)、ofstream(输出)、fstream(输入输出).

#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;int main(void){int i = 12;double j = 3.14;char s[] = "hello";ofstream ofs("1.txt"); //如果没有1.txt 文件 会自动创建 并自动打开ofs << i << " " << j << " " << s << endl;ofs.close();ifstream ifs("1.txt");int i2;double j2 ;string s2;ifs >> i2 >> j2 >> s2;cout << i2 << endl;cout << j2 << endl;cout << s2 << endl;ifs.close();return 0;
}//输出结果
myubuntu@ubuntu:~/lv19/cplusplus/dy08$ cat 1.txt 
12 3.14 hello
myubuntu@ubuntu:~/lv19/cplusplus/dy08$ ./a.out 
12
3.14
hello

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341637.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记(三十五):c++ 函数指针及lambda表达式

本节介绍c函数指针。在一些源码中经常能看到c函数指针&#xff0c;但之前一直觉着这一块比较复杂&#xff0c;就一直没去仔细研究&#xff0c;终于有时间去仔细研究这一块内容了。 c风格的函数指针 函数指针是指将一个函数赋值给一个变量的方法&#xff0c;可以将函数作为一个参…

linux命令--管道详解

关于linux命令的管道符的理解 管道&#xff1a;是进程之间的一种通信方式&#xff0c;主要适用的典型类型&#xff1a;父子进程 创建管道的函数c底层接口&#xff1a;int pipe(int f[2]) 返回的int类型&#xff0c;f[1]代表写&#xff0c;f[0]代表读 父进程使用fork函数创建副…

2024美赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&…

2024年1月11日 主题:非枪人生

2024年1月11日15:58:29 2024年1月11日15:35:13 2024年1月11日15:57:51 对物理进行大致预 2024年1月11日20:27:14 结论&#xff1a;不适合进行数据结构的训练和对电路的模拟感受 2024年1月11日20:28:32 今天也平静的结束了 不需要键盘的支持也就这么结束了我也不知道…

怎么处理网站的一些安全风险

随时互联网的持续发展&#xff0c;数字化转型步伐不断加快&#xff0c;社会各行业都走进了信息化、数字化。但与此同时&#xff0c;网络发展带来了许多风险&#xff0c;各行业面临着日益复杂的数据安全和网络安全威胁。其中&#xff0c;网站的安全风险持续增长&#xff0c;是各…

C++ Primer 6.2参数传递 知识点+练习题

C Primer 6.2参数传递 知识点练习题 指针形参使用引用拷贝Const 形参实参尽量使用常量引用数组形参数组引用形参传递多维数组向main函数传参数含有可变形参的函数练习题待更新 指针形参 void reset(int *p) {*p0;//p指向的整型对象变为0p0;//只是对形参改变p&#xff0c;使其为…

详解如何撰写一个基础的技术交底书

大家好,我是英子老师。作为一名知识产权专家,深耕于专利行业十余年,具有丰富的专利工作经验:曾在大型专利代理机构从事专利代理工作、专利质检工作(抽查代理机构的专利代理人的撰写质量并评分);之后在知名上市企业、行业龙头企业担任高级专利工程师的职位,主要工作内容…

Linux ----冯诺依曼体系结构与操作系统

目录 前言 一、冯诺依曼体系结构 二、为什么选择冯诺依曼体系结构&#xff1f; 三、使用冯诺依曼结构解释问题 问题1&#xff1a; 问题2: 四、操作系统 1.操作系统是什么 2.为什么需要操作系统 3.操作系统怎样管理的 4.如何给用户提供良好环境 五、我们是怎样调用系…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷④

任务二 单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码…

第19课 在Android环境中使用FFmpeg和openCV进行开发的一般步骤

在上节课&#xff0c;根据模板文件我们对在Android环境中使用FFmpeg和openCV进行开发有了一个初步的体验&#xff0c;这节课&#xff0c;我们来具体看一下其工作流程。 1.程序的入口 与VS2013程序开发类似&#xff0c;Android程序开发也有一个入口&#xff0c;在这个模板中&a…

图像识别与计算机视觉有什么区别?

图像识别和计算机视觉在很多方面存在差异&#xff0c;这些差异主要体现在以下几个方面&#xff1a; 1. 研究范围 图像识别是计算机视觉领域的一个子集。计算机视觉不仅包括图像识别&#xff0c;还涵盖了更广泛的内容&#xff0c;如场景理解、目标跟踪、分割、识别和解释等。简而…

SQL-分组查询

目录 DQL-分组查询 分组查询注意事项&#xff1a; DQL- 排序查询 &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &…