c++输入输出流和文件操作总结

目录

一、c++的输入输出流——>

指的是字节流的数据传送;具有类型安全和可扩展性。

 二、流的出入路径

 三、c++流类库

①概览

②标准输出流:

③标准输入流:

四、文件操作(ascii文件和二进制文件)

 五、字符串流(或称内存流)


一、c++的输入输出流——>

指的是字节流的数据传送;具有类型安全和可扩展性。

从操作系统的角度来看,我们可以将每个输入输出设备都视作一个文件,程序的输入输出即可视为数据在文件—程序间的传输:

输入文件——>程序——>输出文件

对于C++,输入输出包括3方面:

1、标准I/O;(系统指定的标准设备如键盘、显示器)

2、文件I/O;(外存,如磁盘)

3、串I/O。(内存中指定空间,常用一个字符数组存储各类数据)
​

 二、流的出入路径

可以如下表示:

内存为字节流开辟内存缓冲区,用于存放数据。

反过来说,缓冲区中的数据即为流。

cout<<(cout流或标准输出流) 流路径===》

程序——>输出流——>输出缓冲区——>显示器
(保存于缓冲区时,当①缓冲区满②遇到endl,将数据送出)
 (\n不会刷新缓冲区,但有时一些编译系统也不过多区分)
​

对于输入的数据,当按下回车键===》

键盘缓冲区——>输入缓冲区,并形成流。

 三、c++流类库

①概览

·stdin(标准输入设备)为参数,使cin与设备关联。(cin流:标准输入流)

·istream(ostream也是)类中重载<<,对不同类型都要分别重载一次。

·cout<<"111"等价于cout.operator<<("111") ,调用的重载是(char *)型-----字符串111的值为其首字节的地址。

·cout将数据插入到cout流,函数返回流对象cout

②标准输出流:

iostream头文件中定义了4种流对象cin,cout,cerr,clog

cerr是标准错误流,输出于标准错误设备(stderr)(区分于正常输出(stdout)),且cerr流中的信息只在显示器输出。它与clog的区别仅有,cerr不经过缓冲区存放、而是直接输出的。

cout.put('a')

输出a;(专门输出单字符,参数为字符或ascii码)

连续调用:cout.put(65).put(66).put('\n');

基本等价于c语言中的putchar();

③标准输入流:

>>通常跳过空格和换行符等;

cin为非0值:输入流在正常状态,提取操作成功;(“文件结束符”:ctrl+Z或+D)

成员函数get:

一、cin.get();返回读入的字符(包括空白字符);
              若遇到文件结束符,返回EOF(-1).
二、cin.get(ch);
              读取失败返回0.
   //前两种用法同C语言中的getchar
三、cin.get(字符数组,字符数n,终止符);
               读取n-1个字符(!!!);失败返回0.

getline:

cin.getline(字符数组,字符数n,终止符);
​

(上面两个“字符数组”都可替换为字符指针;(存入其指向的数组))

(终止符由自己选定;)

(都读取n-1个字符,末尾加上'\0'。)

【对cin.getline和cin.get说明】:

/cin.getline(arr,20),同样可读取空格,在读取完指定数目字符后或者遇到换行符时,停止读取。如例参数为20,则至多读取19个字符,余下空间存储自动添加在结尾的\0。

/格式类似的,还有cin.get(arr,20),不同的是geline读取并丢弃换行符,而cin.get仅将其留在输入队列中。同样cin也会将回车键生成的换行符留下。一般后面再要输入时,得加一个无参数的cin.get(),读取下一个符号即处理留下的换行符。否则直接输入时会因为检测到换行符而认为已到行尾而不再读取。
 

eof:cin.eof();

若到达文件末尾(遇文件结束符)——>函数值非0。

peek:cin.peek();

观测当前指针所指字符。(之所以能观测下一个,是因为当读取完一个字符,指针已跳到下一个)

putback:cin.putback(ch);

前面用get/getline读取的某一字符ch返回到输入流并插入到当前指针位置。(往后读第一个便能读取)(例如,可用在一个字符数组c,终止后可以继续读取c)

ignore:cin.ignore(n,终止符);

括号内容含义:(跳过输入流中的n个字符,遇到终止符不再跳过)//也可不带参数或带一个。

默认:cin.ignore()==cin.ignore(1,EOF)。

四、文件操作(ascii文件和二进制文件)

(源程序文件.cpp,目标文件.obj,可执行文件.exe,数据文件date file.)

1、根据文件中数据组织形式,将文件分为两类:

ASCII文件/字符文件/文本文件:每个字节放一个ascii码
二进制文件/内部格式文件/字节文件:按在内存中的存储形式原样输出

 字符信息在内存中以ascii码存放,此时二种文件输出时,数据形式一样。

对于数字,则数据形式不同。(ascii为逐字,内部格式为数字值)

 · ascii文件,便于屏幕直接阅读,但存储时转换耗时多,占空间多。

2、文件流:以外存文件为I/O对象的数据流,每个文件流有一个内存缓冲区与之对应。

外存文件输入————>内存————>输出到外存文件

文件流对象需要自己定义;(如定义输出文件流对象:ofstream outfile;)

②调用成员函数open:

outfile.open("f1.dat",ios::out);

//文件名可包括路径("c:\new\f1.dat"),后面是输入输出方式,默认是ios::out,可省写
​
​

//以上两步可合并:ofstream outfile("f1.dat",ios::out);——(调用了带参数的构造函数

若打开失败,open返回0;对构造函数,失败时流对象值为0

成员函数close:

outfile.close();——解除该文件与文件流的关联。

outfile<<a[i]....——向关联的磁盘文件输出数据。

exit(1);——应用程序终止并返回状态码1。

再次用不同方式打开一个文件前,先关闭

/对于ascii文件,一字节放一字符,如:一篇英文文章的文本文件。操作就是正常文本读写。

/对二进制文件(内存数据的映像文件/字节文件),打开时要用ios::binary指定。可以作为既能输出又能输入的文件。↓↓↓

3、二进制文件操作

①成员函数write,read:

ofstream outfile("filename",ios::out|ios::binary);//ios::out可省略

outfile.write(p,50);
//将字符指针p指向的单元的开始的50个字节的内容,不加转换地写到与outfile关联的磁盘文件中
​

对于ifstream对象,读入50个字节存放在字符指针p所指空间内。

(上面括号内的形参(p处)是字符指针或者字符串的首地址,注意类型匹配!

(abort();——>退出程序,同exit(1).)

两种结构体指针的write方法:
1、for循环
2、outfile.write((char*)&stru[0],sizeof(stru));
//输出数据间不必加空格(靠字节数来控制读入数据)

与位置标记(可以理解为,外存版的指针)有关的成员函数:

gcount()
tellg()/tellp()
seekg(位置)/seekp(位置)
也可用双参数(位移量,参照位置)
参照位置:
ios::beg(默认)
ios::cur
ios::end

 五、字符串流(或称内存流)

字符串流不同于字符数组,可以按其他类型的数据形式读取数据。

向字符数组存入数据前,先将数据从二进制形式转换为ascii码放在缓冲区,后再发送。

从字符数组读取数据时,先将其中的ascii数据送到缓冲区后再发送,转换为二进制形式给程序中变量。

简而言之:
二进制——>输入给变量
ascii——>输出到屏幕

对于文件有文件结束符,对str,需自己指定一个特殊字符为结束标志。

①建立输出字符串流对象(并与字符数组关联)

ostrstream strout(arr,20); //20为缓冲区长度
​

 strout<<ends;  //用操作符ends向流插入一个'\0'。(通常作为字符串结束标志)

转换为ascii代码存入到字符数组。

②建立输入字符串流对象

istrstream strin(arr2,20); //若无20,则全部数据都作为流中内容

③输入输出对象:

strstream io(arr3,n,ios::in|ios::out);

输入字符串流和输出字符串流分别有流位置标记。

输出字符串流从数组首地址开始,会更新其中内容。

存取速度快但有生命周期,一般同main。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java在SpringCloud中自定义Gateway负载均衡策略

Java在SpringCloud中自定义Gateway负载均衡策略 一、前言 spring-cloud-starter-netflix-ribbon已经不再更新了&#xff0c;最新版本是2.2.10.RELEASE&#xff0c;最后更新时间是2021年11月18日&#xff0c;详细信息可以看maven官方仓库&#xff1a;org.springframework.clou…

uniapp 输入手机号并且正则校验

1.<input input“onInput” :value“phoneNum” type“number” maxlength“11”/> 3. method里面写 onInput(e){ this.phoneNum e.detail.value }, 4.调用接口时候校验正则 if (!/^1[3456789]\d{9}$/.test(this.phoneNum)) {uni.showToast({title: 请输入正确的手机号…

K8S网络类型

k8s的网络类型 k8s的通信模式 1 pod内部之间容器与容器之间的通信&#xff0c;在同一个pod中容器是共享资源和网络&#xff0c;使用同一个网络命名空间&#xff0c;可以直接通信 2 同一个node节点之内&#xff0c;不同pod之间的通信&#xff0c;每个pod都有一个全局的真实ip地…

Qt学习:Qt的意义安装Qt

Qt 的简介 QT 是一个跨平台的 C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 支持平台 xP 、 Vista、Win7、win8、win2008、win10Windows . Unix/Linux: Ubuntu 等…

gin框架使用系列之六——自定义中间件

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》《gin框架使用系列之五——表单校验》 一、gin中间件概述 gin中将…

【项目】玩具租赁博客测试报告

目录 一、项目背景 二、项目功能 三、功能测试 一、项目背景 玩具租赁系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将其部署到云服务器上。前端主要有十五个页面构成&#xff1a;用户注册、管理员注册、登录页、用户和管理…

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…

matlab列优先与高维矩阵重构

由于matlab在列化a(:)以及reshape(a)等操作中是列优先的&#xff0c;所以要重构出新的高维度矩阵&#xff0c;通常要把reshape和permute结合起来使用。 先到 http://caffe.berkeleyvision.org/ 下载 训练好的model bvlc_reference_caffenet.caffemodel; 更多caffe使用也请参看…

操作教程|MeterSphere UI测试+VNC:简单、快捷地查看UI测试实时执行详情

编者注&#xff1a;本文为CSDN博主hxe116的原创文章。 原文链接为&#xff1a;https://blog.csdn.net/hxe116/article/details/134714960?spm1001.2014.3001.5502 作为一款一站式的开源持续测试平台&#xff0c;MeterSphere涵盖了测试跟踪、接口测试、UI测试和性能测试等功能…

java浅拷贝BeanUtils.copyProperties引发的RPC异常 | 京东物流技术团队

背景 近期参与了一个攻坚项目&#xff0c;前期因为其他流程原因&#xff0c;测试时间已经耽搁了好几天了&#xff0c;本以为已经解决了卡点&#xff0c;后续流程应该顺顺利利的&#xff0c;没想到 人在地铁上&#xff0c;bug从咚咚来~ 没有任何修改的服务接口&#xff0c;抛出…

python实现一维傅里叶变换——冈萨雷斯数字图像处理

原理 傅立叶变换&#xff0c;表示能将满足一定条件的某个函数表示成三角函数&#xff08;正弦和/或余弦函数&#xff09;或者它们的积分的线性组合。在不同的研究领域&#xff0c;傅立叶变换具有多种不同的变体形式&#xff0c;如连续傅立叶变换和离散傅立叶变换。最初傅立叶分…

NAS上使用Docker搭建Wiki.js构建云知识库

文章目录 NAS上使用Docker搭建Wiki.js、PostgreSQL和Nginx云知识库前置条件步骤1&#xff1a;获取wikijs的镜像步骤2&#xff1a;配置容器参数2.1 端口设置2.2 挂载设置2.3 环境变量设置&#xff08;配置数据库&#xff09; 步骤3. 启动界面3.1 切换语言3.2 GIT 配置3.3 用户和…

Flask 日志

flask 日志 代码源码源自编程浪子flask点餐小程序代码 记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类&#xff0c;用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类&#xff0c;其中包含了两个静态方法&#xff1a;addAcc…

小程序开发平台源码系统:创建专属你的小程序 海量模板任你选择 带完整的代码包以及搭建教程

小程序作为一种轻量级的应用程序&#xff0c;已经深入到人们的日常生活之中。今天来给大家分享一个小程序开发平台源码系统&#xff0c;轻松搭建小程序&#xff0c;还有完整的代码包以及搭建教程。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.海量模板任…

STM32 IIC开发学习

1IIC总线时序图 ① 起始信号 当 SCL 为高电平期间&#xff0c;SDA 由高到低的跳变。起始信号是一种电平跳变时序信号&#xff0c;而不是 一个电平信号。该信号由主机发出&#xff0c;在起始信号产生后&#xff0c;总线就会处于被占用状态&#xff0c;准备数据 传输。 ② 停止信…

ios环境搭建_xcode安装及运行源码

目录 1 xcode 介绍 2 xcode 下载 3 xocde 运行ios源码 1 xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具&#xff08;IDE&#xff09;&#xff0c;由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计&#xff0…

矿泉水硝酸盐和溴酸盐超标解决工艺

在当今社会&#xff0c;人们对健康和优质生活的追求不断提升&#xff0c;使得瓶装饮用水的安全问题受到了广泛关注。溴酸盐和硝酸盐作为自然水体中常见的物质&#xff0c;若在矿泉水中含量过高&#xff0c;可能会对消费者的健康构成潜在威胁。因此&#xff0c;探究有效去除矿泉…

【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代

目录 前言 机器视觉 缺陷检测 工业上常见缺陷检测方法 内容简介 作者简介 目录 读者对象 如何阅读本书 获取方式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 机器视觉…

WPF项目创建HTTP WEB服务,不使用IIS业务 WPF桌面程序WebApi WPF 集成WebApi C# 创建HTTP Web API服务

在C# WPF应用程序中直接创建HTTP服务或WebAPI服务有以下优点&#xff1a; 自托管服务&#xff1a; 简化部署&#xff1a;无需依赖外部服务器或IIS&#xff08;Internet Information Services&#xff09;&#xff0c;可以直接在应用程序内部启动和运行Web服务。 集成紧密&…

如何在无公网IP环境使用Windows远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…