C++ primer 第8章 IO库

文章目录

  • IO库类型和头文件
  • IO对象无拷贝或赋值
  • IO流的条件状态
  • 文件输入输出
    • ifstream 示例
    • ofstream 示例
  • 文件模式
    • 以out模式打开文件会丢弃已有数据
    • 每次调用open时都会确定文件模式
    • ofstream 保留源文件 追加数据 示例
  • string流
    • istringstream示例
    • ostringstream示例

IO库类型和头文件

为了支持不同种类的IO处理操作,标准库定义了一些IO类型。
iostream定义了用于读写流的基本类型。fstream定义了读写命名文件的类型。sstream定义了读写内存string对象的类型。
类型ifstream和istringstream都继承自istream,因此,我们可以像使用istream对象一样来使用ifstream和istringstream。
在这里插入图片描述

IO对象无拷贝或赋值

由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。

IO流的条件状态

一个流一旦发生错误,其上后续的IO操作都会失败。只有当一个流处于无错状态时,我们才可以从它读取数据,向它写入数据。由于流可能处于错误状态,因此代码通常应该在使用一个流之前检查它是否处于良好状态。确定一个流对象的状态的最简单的方法是将它当做一个条件使用。
badbit表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流就无法再使用了。在发生可恢复错误后,failbit被置位,如期望读取数值却读出一个字符等错误。这种问题通常是可以修正的,流还可以继续使用。如果到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,表示流未发生错误。如果badbit、failbit和eofbit任一个被置位,则检测流状态的条件会失败。

文件输入输出

头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写给定文件。
在这里插入图片描述
创建文件流对象时,我们可以提供文件名(可选的)。如果提供了一个文件名,则open成员函数会自动被调用,示例如下:

ifstream in(ifile);  // 构造一个ifstream并打开给定文件ifile,在新c++标准中,文件名ifile既可以是库类型string对象,也可以是C风格字符数组
ofstream out; // 输出文件流未关联到任何文件

在要求使用基类型对象的地方,我们可以用继承类型的对象来替代。这意味着,接受一个iostream类型引用(或指针)参数的函数,可以用一个对应的fstream(或sstream)类型来调用。也就是说,如果有一个函数接受一个ostream&参数,我们在调用这个函数时,可以传递给它一个ofstream对象,对istream&和ifstream也是类似的。

流如果调用open失败,failbit会被置位。对一个已经打开的文件流调用open会失败,并会导致failbit被置位。随后的试图使用文件流的操作都会失败。为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件。一旦文件成功关闭,我们就可以打开新的文件关联新的文件。

当一个fstream对象被销毁时,close会自动被调用。

ifstream 示例

打开string文件,按行存储元素,str即是每一行的string

ifstream in("text.txt");
string str;
getline(in,str);

将每一个单词作为一个独立的元素进行存储

ifstream in("text.txt");
string str;
in>>str;

ofstream 示例

ofstream ofs("test.txt");
ofs << "hello"<<" world"<<endl;

文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件。
在这里插入图片描述

以out模式打开文件会丢弃已有数据

默认情况下,我们打开一个ofstream时,文件的内容会被丢弃。阻止一个ofstream清空给定文件内容的方法是同时指定app模式。
保留被ofstream打开的文件中已有数据的唯一方法是显式指定app或in模式。

每次调用open时都会确定文件模式

通常情况下,out模式意味着同时使用trunc模式,即当前文件内容将被清空。当指定app模式时,文件中的已有数据得以保留,所有写操作都在文件末尾进行。
在这里插入图片描述

ofstream 保留源文件 追加数据 示例

ofstream ofs("test.txt",ofstream::app);
ofs << "hello"<<" world"<<endl;

string流

sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。
istringstream从string读取数据,ostringstream向string写入数据,而头文件stringstream既可以从string读取数据也可以向string写入数据。
在这里插入图片描述

istringstream示例

以整行为元素读取文件,存入vector中,并用istringstream从vector中读取元素,每次读取一个单词

ifstream ifs("test.txt");string str;vector<string>vec;while (getline(ifs,str)) {vec.push_back(str);}for (auto a:vec) {istringstream vecStr(a);string tmp;while(vecStr >> tmp)cout << tmp<<endl;}

ostringstream示例

ostringstream os;
os << "hello" << " world" << endl;
cout << os.str();

此时界面上会显示hello world

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

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

相关文章

codeforces 486A-C语言解题报告

题目网址 题目解析 1.f(n)(-1)^nn 2.使用long long int 3.总结找出规律: if(i%2!0) return -1(i1)/2; else return i/2; 直接暴力求解—超时 #include<stdio.h> #include<stdlib.h> // TIME_LIMIT_EXCEEDED,此方法不行,超时 //注意规律&#xff01;&#xff01…

C++面试宝典 基本语言(三)

如果同时定义了两个函数&#xff0c;一个带const&#xff0c;一个不带&#xff0c;会有问题吗&#xff1f; 不会&#xff0c;这相当于函数的重载 #include<iostream> class A{ public:void print()const{std::cout << "Hello" << std::endl;}void…

C++ primer 第9章 顺序容器

文章目录顺序容器类型确定使用哪种顺序容器容器库概览容器操作迭代器迭代器支持的所有操作迭代器支持的所有运算迭代器范围对构成范围的迭代器的要求标准库迭代器范围左闭右开的三种性质容器定义和初始化将一个新容器创建为另一个容器的拷贝将array拷贝到vector中的代码与顺序容…

常用单位换算

字节单位换算 B(byte)字节 bit 位 1B 8 bit 1KB&#xff08;Kilobyte&#xff0c;千字节&#xff09;1024B 2^10 B&#xff1b; 1MB&#xff08;Megabyte&#xff0c;兆字节&#xff0c;百万字节&#xff0c;简称“兆”&#xff09;1024KB 2^20 B&#xff1b; 1GB&#xf…

牛客网C++面经 容器和算法

原文网址 参考网址 C语言中文网 请你来说一下map和set有什么区别&#xff0c;分别又是怎么实现的&#xff1f; map和set都是C的关联容器&#xff0c;其底层实现都是红黑树&#xff08;RB-Tree&#xff09;。由于 map 和set所开放的各种操作接口&#xff0c;RB-tree 也都提供…

C语言指针-字符指针整型指针char*s int*a

案例代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {//字符指针char *pstr"good dog ww";printf("字符指针指向的字符串内容:%s\n",pstr);printf("字符指针本身的地址:%p\n",&pstr);printf…

C++ primer 第10章 泛型算法

文章目录概述findcount初识泛型算法只读算法只读算法accumulate只读算法equal写容器元素的算法算法fill算法fill_nback_inserter算法copy算法replace replace_copy重排容器元素的算法sortuniqueunique_copy定制操作向算法传递函数谓词算法stable_sort算法partitionlambda表达式…

C语言常用字符串函数

概括 代码 #include<stdlib.h> #include<stdio.h> #include<string.h> int main() {//常用字符串函数char a[]"abcSDFbnm";char b[]"SD";printf("a的字符串长度:%d\n",strlen(a));printf("b的字符串长度:%d\n",str…

C++ primer 第11章 关联容器

文章目录使用关联容器map示例关联容器概述定义关联容器关联容器值初始化multimap和multiset关键字类型的要求pair类型pair上的操作关联容器操作关联容器额外的类型别名关联容器迭代器map迭代器set迭代器关联容器和算法添加元素向map添加元素检测insert的返回值使用insert代替下…

C++ primer 第12章 动态内存

文章目录前言动态内存与智能指针shared_ptr类shared_ptr和unique_ptr都支持的操作shared_ptr独有的操作make_shared 函数shared_ptr的拷贝和赋值shared_ptr自动销毁所管理的对象shared_ptr还会自动释放相关联的内存程序使用动态内存出于以下原因直接管理内存使用new动态分配和初…

C语言顺序查找二分查找

介绍 顺序查找 按照顺序一个个查找 #include<stdio.h> //顺序查找 int search(int arr[],int len,int aim) {int i;for(i0;i<len;i){if(arr[i]aim){return i;//返回下标 }}return -1;//表示未查询到} int main() {int arr[]{13,355,256,65,234,-1,35,-6,-3,-4,0};…

C++ primer 第12章 12.3 使用标准库:文本查询程序

文章目录使用标准库&#xff1a;文本查询程序文本查询程序设计数据结构在类之间共享数据自己的文本查询程序书中的文本查询程序使用标准库&#xff1a;文本查询程序 我们将实现一个简单的文本查询程序&#xff0c;作为标准库相关内容学习的总结。 我们的程序允许用户在一个给…

C语言二维数组 int arr[2][3]

基础使用 先遍历行再遍历列 #include<stdio.h> //二维数组的基本使用 int main() {//二维数组的初始化int arr1[2][2]{{2,2},{0,0}};int arr2[2][3]{2,2,2,8,8,8};int arr3[6][9];int i,j;for(i0;i<6;i){for(j0;j<9;j){arr3[i][j]1;}}arr3[2][5]0;//打印printf(&…

牛客网C++面经 类和数据抽象

请你来说一下C中struct和class的区别 在C中&#xff0c;可以用struct和class定义类&#xff0c;都可以继承。区别在于&#xff1a;structural的默认继承权限和默认访问权限是public&#xff0c;而class的默认继承权限和默认访问权限是private。另外&#xff0c;class还可以定义…

C++ primer 第13章 拷贝控制

文章目录前言拷贝、赋值与销毁拷贝构造函数合成拷贝构造函数拷贝初始化和直接初始化拷贝初始化的发生&#xff1a;参数和返回值拷贝初始化的限制拷贝赋值运算符重载赋值运算符合成拷贝赋值运算符析构函数析构函数完成的工作什么时候会调用析构函数合成析构函数代码片段调用几次…

C语言 指针自增自减加减运算 p++ p+i

介绍 自增自减代码 #include<stdio.h> #include<string.h> //指针自增--short void increase(short *arr,int len) {int i;arr&arr[0];for(i0;i<len;i){printf("arr[%d]%d,address%p\n",i,*arr,arr);arr;} }//指针自减--char void decrease(char…

C++ 编译与底层

原文链接 编译与底层请你来说一下一个C源文件从文本到可执行文件经历的过程&#xff1f; 对于C源文件&#xff0c;从文本到可执行文件一般需要四个过程&#xff1a;预处理阶段&#xff1a;对源代码文件中文件包含关系&#xff08;头文件&#xff09;、预编译语句&#xff08;…

C语言 指针数组-字符指针数组整型指针数组 char*s[3] int*a[5] 数组指针int(*p)[4]

基本介绍 1.指针数组:由n个指向整型元素的指针而组成,里面存放指针 Int *ptr[3]; 2.地址: ptr[i]:元素地址 &ptr[i]:指针地址 图示 代码: 内存布局: 代码 #include<stdio.h> #include<string.h> //指针数组--int void pointer(int *arr,int len) {int …

uninitialized_copy测试代码示例

原测试代码如下&#xff1a; int main() {vector<int>v1{1,3,5,7,9,2,4,6,8};allocator<int>alloc;auto data alloc.allocate(9);uninitialized_copy(v1.begin(),v1.end(), data);auto end data 9;while(data!end) {cout << *data <<" "…

C语言的地址 内存

取地址在CPU的寄存器产生&#xff0c;不占据内存地址由计算器总线&#xff0c;地址作为常量不消耗内存指针 存储不同的地址&#xff0c;间接赋值空类型指针 void* 类型指针 不可以取数据 或者修改数据 需要进行强制类型转换int num 10;void *p &num;std::cout << …