C++开发基础——IO操作与文件流

news2024/11/25 18:34:13

一,基础概念

C++的IO操作是基于字节流,并且IO操作与设备无关,同一种IO操作可以在不同类型的设备上使用。

C++的流是指流入/流出程序的字节序列,在输入操作中数据从外部设备(键盘,文件,网络等)流入程序,在输出操作中数据从程序流向外部设备(控制台,文件,网络等)。

流充当了程序与外部设备之间的管道,使程序中的具体操作独立于各种外部设备。

常用的流:基础输入输出流,文件流,字符串流。

流的实例不仅包含普通的数据,还包含表示当前位置的数据。

在C++编程中,流的使用步骤如下:

1.实例化一个流对象。

2.将流对象关联到实际的外部设备(键盘,控制台,文件,网络等)。

3.调用流对象中提供的成员函数,完成数据的转换、传输等操作。

4.断开流对象与外部设备的关联,比如关闭文件。

5.释放流对象占用的内存资源。

流具有缓冲区,大部分时候,往流中写入数据后,流并不会马上把数据输出到指定目的地,为了提高性能,流先用缓冲区将数据存储起来,缓冲区达到一定大小后再输出到指定目的地。

刷新缓冲区的条件:

遇到触发的函数,如endl。

流对象离开作用域,被析构时。

流的缓冲区被写满。

显式调用flush()函数。

流对应的头文件有<ostream>, <fstream>等。

流支持的数据类型:数值类型,指针,char类型,std::string类,C风格字符串等。

std标准库包含预定义的流的实例,有cout,cin,cerr,clog等。

二,输出流

1.输出流的定义

对应运算符:operator<<            

含义:流中的数据输出到外部设备,"设备  <<  程序"。

<<运算符返回的是对一个流的引用,因此,可以连续调用多次<<运算符,来连续输出多段数据。

C++流遇到C风格的转义字符,比如“\n”,可以自动做解析。

“\n”和end都可以实现换行,但是“\n”只是换行,而end还会刷新缓存。

2.输出流的原始方法

(1).输出

put():写入单个字符。

write():写入字符数组。

代码样例,输出到控制台打印:

const char* test = "hello there";
cout.write(test, strlen(test));
cout.put('a');

(2).刷新缓冲区

flush()

代码样例,显式刷新流:

cout << "abc";
cout.flush();
cout << "de";
cout << "fgh";
cout << endl;

(3).判断流是否可用

good():可用时,返回true。

代码样例:

if (cout.good()){
    cout << "All good" << endl;
}

bad():发生致命错误时,返回true。

fail():最近一次操作失败时,返回true。

代码样例:

cout.flush();
if (cout.fail()){
    cerr << "Unable to flush to standard out" << endl;
}

3.输出流的操作算子

以下算子可以用来格式化输出流:

endl:输出一个行结束序列,并刷新缓存。

hex、oct、dec:以十六进制、八进制、十进制输出数字。

setw:设置输出数值型数据的字段宽度。

setfill:设置用于填充的字符。

setprecision:设置输出小数时的小数位数。

代码样例:

#include <chrono>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int i = 123;
    cout << "The result is:" << setw(6) << i << endl;
    cout << "The result is:" << setfill('*') << setw(6) << i << endl;

    float j = 0.123456;
    cout << "The result is:" << setprecision(3) << j << endl;
}

运算结果:

The result is:   123
The result is:***123
The result is:0.123

三,输入流

1.输入流的定义

对应运算符:operator>>

含义:流中的数据从设备读入到程序中,"设备  >>  程序"。

2.输入流的原始方法

输入流也可以像输出流一样调用good()、bad()、fail()等方法,还可以调用eof()判断流的指针是否到达尾部。

(1).输入

get():读取单个字符。

read():读取字符数组。

(2).回退

unget():在读取的时候回退一个位置,将读取的前一个字符放回到流中。如果当前位置是流的起始位置,调用unget()会失败。

putback():和unget()一样支持回退,但是putback()可以指定放回的字符。

(3).预览

peek():预览调用get()后返回的下一个值。

(4).读取整行

getline():从输入流中获得一行数据,用法区别于C++中的std::getline()函数。

3.输入流的操作算子

以下算子可以用来格式化输入流:

hex、oct、dec:以十六进制、八进制、十进制读入数字。

skipws:输入时跳过空白字符,默认情况下为skipws。

noskipws:输入时读取空白字符作为标记。

代码样例:

#include <iostream>
#include <sstream>

int main()
{
    char c1, c2, c3;
    std::istringstream("a b c") >> std::skipws >> c1 >> c2 >> c3;
    std::cout << "skipws behavior:"
        " c1 = " << c1 <<
        " c2 = " << c2 <<
        " c3 = " << c3 << '\n';
    std::istringstream("a b c") >> std::noskipws >> c1 >> c2 >> c3;
    std::cout << "noskipws behavior:"
        " c1 = " << c1 <<
        " c2 = " << c2 <<
        " c3 = " << c3 << '\n';

    return 0;
}

运行结果:

skipws behavior: c1 = a c2 = b c3 = c
noskipws behavior: c1 = a c2 =   c3 = b

四,字符串流

对应头文件:<sstream>

常用字符串流:

std::ostringstream:将数据写入字符串

std::istringstream:从字符串读取数据

std::stringstream:双向操作字符串

1.字符串流支持的模式

ios::in:进行输入操作。
ios::out:进行输出操作。
ios::app:在字符串流后面追加。
ios::trunc:截断字符串。
ios::binary:用于二进制(原始字节)IO 操作,而不是基于字符的操作。
ios::ate:将指针移动到流的末尾。

2.字符串流的常用方法

字符输入流的操作:

operator>>:格式化输入。

get:读取单个字符。

read:读取字符数组。

getline:读取整行字符。

readsome:读取若干数量的字符。

peek:预览下一个字符。

unget:读取期间,回退一个字符。

tellg:返回流中的当前操作位置。

seekg:移动到流中的指定位置。

sync:与存储设备同步。

字符输出流的操作:

operator<<:格式化输出。

put:写入单个字符。

write:写入字符数组。

tellp:返回流中的当前操作位置。

seekp:移动到流中的指定位置。

flush:刷新数据到存储设备。

和状态相关的操作:

good()、bad()、fail()、eof():前面已经讲过。

setstate:设置状态。

clear:清除状态。

3.代码样例

#include <iostream>
#include <sstream>
#include <string>
#include <map>
using namespace std;

int main()
{
    string mystr = "how to study cpp very very good";
    map<string, int> myMap;

    stringstream ss(mystr);
    string Word;
    while (ss >> Word)
    {
        myMap[Word]++;
    }

    map<string, int>::iterator it;
    for (it = myMap.begin(); it != myMap.end(); it++)
    {
        cout << it->first << " -> "
             << it->second << "\n";
    }
    return 0;
}

运行结果:

cpp -> 1
good -> 1
how -> 1
study -> 1
to -> 1
very -> 2

五,文件流

头文件:<fstream>

常用文件流:

std::ofstream:将数据写入文件

std::ifstream:从文件读取数据

std::fstream:双向操作文件

std::ofstream, std::ifstream文件流的析构函数会自动关闭底层文件,所以操作完文件流以后不需要显式调用close()函数。

1.文件流支持的模式

ios::in:进行输入操作。
ios::out:进行输出操作。
ios::app:在文件流后面追加。
ios::trunc:截断文件内容。
ios::binary:用于二进制(原始字节)IO 操作,而不是基于字符的操作。
ios::ate:将指针移动到流的末尾。

文件流默认以文本模式打开文件流,如果指定了ios_base::binary,文件流将以二进制模式被打开。

2.文件流的常用方法

文件输入流的操作:

operator>>:格式化输入。

get:读取单个字符。

read:读取字符数组。

getline:读取整行字符。

readsome:读取若干数量的字符。

peek:预览下一个字符。

unget:读取期间,回退一个字符。

tellg:返回流中的当前操作位置。

seekg:移动到流中的指定位置。

sync:与存储设备同步。

文件输出流的操作:

operator<<:格式化输出。

put:写入单个字符。

write:写入字符数组。

tellp:返回流中的当前操作位置。

seekp:移动到流中的指定位置。

flush:刷新数据到存储设备。

和状态相关的操作:

good()、bad()、fail()、eof():前面已经讲过。

setstate:设置状态。

clear:清除状态。

3.代码样例

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    fstream obj;
    obj.open("test.txt", ios::out);
    obj << "Hello World";
    int pos1, pos2;

    pos1 = obj.tellp();
    cout << pos1 << endl;
    obj.seekp(0, ios::end);

    obj << "C++";
    pos2 = obj.tellp();
    cout << pos2 << endl;

    obj.close();
}

运行结果:

11
14

六,参考阅读

《C++高级编程》

https://zh.cppreference.com/w/cpp/io/basic_stringstream

https://zh.cppreference.com/w/cpp/io/basic_ifstream

https://www3.ntu.edu.sg/home/ehchua/programming/cpp/cp10_io.html

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

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

相关文章

Qt 使用RAW INPUT获取HID触摸屏,笔设备,鼠标的原始数据,最低受支持的客户端:Windows XP [仅限桌面应用]

在开发绘图应用程序时&#xff0c;经常会需要读取笔设备的数据&#xff0c;通过对笔数据的解析&#xff0c;来判断笔的坐标&#xff0c;粗细。如果仅仅只是读取鼠标的坐标&#xff0c;就需要人为在应用程序端去修改笔的粗细&#xff0c;并且使用体验不好&#xff0c;如果可以实…

SQL笔记——数据库系统导论(数据库的设计)

目录 数据依赖范式第一范式1NF第二范式2NF第三范式3NFBC范式 数据依赖的公理系统闭包最小依赖集候选码 设计需求分析概念结构设计E-R图的概念模型E-R模型转换为关系模型(指出转换结果中每个关系模式的主码和外码) 逻辑结构设计物理结构设计数据库实施数据库运行和维护 数据依赖…

安装配置MySQL

安装配置MySQL主要包括以下步骤&#xff1a; 1、检查并卸载旧版本的MySQL 2、如果不使用Mariadb&#xff0c;则也需要卸载 3、离线安装MySQL MySQL数据库安装在node3节点上&#xff0c;其他节点通过远程访问的方式使用MySQL数据库。 在node3检查并卸载老版本的MySQL 使用…

ARMv8架构特殊寄存器介绍-1

1&#xff0c;ELR寄存器&#xff08;Exception Link Register &#xff09; The Exception Link Register holds the exception return address。 异常链接寄存器保存异常返回地址。最常用也很重要。 2&#xff0c;SPSR&#xff08;Saved Process Status Register&#xff09;…

Linux环境下,QtCreator运行不起来

文章目录 一、qtcreator运行不起来二、错误信息三、下载libxcb-cursor四、安装 一、qtcreator运行不起来 直接点击qtcreator运行不起来 然后再命令行界面下&#xff0c; 进入到qtcreator所在的目录&#xff1a; cd /opt/Qt/Tools/QtCreator/bin 运行程序&#xff1a;./qtcr…

考研C语言复习进阶(1)

目录 1. 数据类型介绍 1.1 类型的基本归类&#xff1a; 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 3. 浮点型在内存中的存储 ​编辑 1. 数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 short //短整型 int /…

使用 Jenkins 和 Spinnaker 构建 Kubernetes CI/CD

无论您是新手还是持续集成和持续交付以及容器化领域的经验丰富&#xff0c;本文都将为您提供设置 Spinnaker 以满足您的软件应用程序交付需求的基本知识。 了解 Jenkins、Spinnaker 和 Kubernetes Kubernetes 和 Jenkins 是两个强大的工具&#xff0c;它们相互配合&#xff0…

图扑数字孪生楼宇智控可视化平台

从概念提出到风险评估再到跟踪实施&#xff0c;关于智慧园区规划与建设的探讨从未停止。传统楼宇控制系统的各子系统独立存在并不互通&#xff0c;所有信息交互都依赖于中央控制器&#xff0c;导致系统控制的实时性较差。 利用大数据、云计算等智能化技术&#xff0c;让人、物…

《计算机网络》考研:2024/3/11:2.1.6-习题精选(5、6题暂未完成)

2024/3/11 2.1.6 习题精选 一、单项选择题 我的答案&#xff1a;1.D 2.A 3.C 4.B 5.A 标准答案&#xff1a;1.D 2.A 3.B 4.B 5.A 3、【解】&#xff1a; 并行传输的特点&#xff1a;距离短、速度快。 串行传输的特点&#xff1a;距离长、速度慢。 在计算机内部通常为了保证速…

介绍kubernetes的功能与架构及其组件

一、功能简介 1、服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器, 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量, 从而使部署稳定. 常用的DNS插件为coreDNS, 用作服务发现和集群中容器通讯; 负载均衡器常使用集群内的service资…

CUDA环境配置在Ubuntu18

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 1 NVIDIA CU…

王道机试C++第 5 章 数据结构三:栈Stack和22年蓝桥杯省赛选择题Day33

5.3 栈 和队列一样&#xff0c;栈&#xff08; Stack &#xff09;也是一种线性序列结构&#xff0c;其存放的元素也是按照线性逻辑次序排列的。然而&#xff0c;与一般的线性结构相比&#xff0c;栈的操作仅限于逻辑上特定的一端&#xff0c;即新元素只能从栈的一端插入也只能…

Docker部署ChatGLM3、One API、FastGPT

创建并运行chatglm3容器 docker run --name chatglm3 -p 8000:8000 registry.cn-hangzhou.aliyuncs.com/ryyan/chatglm.cpp:chatglm3-q5_1 创建并运行one-api容器 (其中挂载路径 D:\one-api 可以选择你自己喜欢的目录) docker run --name oneapi -d -p 3000:3000 -e TZAsia…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+图像缩放,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融合叠加应…

服务器被大流量攻击怎么办?如何防御攻击?

随着网络的发展&#xff0c;我们所遇到的安全挑战也越来越多。尤其是近年来&#xff0c;网络攻击频发&#xff0c;许多互联网企业深受其扰。为了不影响自身业务的稳定运行&#xff0c;许多企业都在想方设法的寻求解决方案&#xff0c;防止服务器被攻击而影响业务发展。下面我们…

Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

常见的排序算法的时间复杂度

常见的排序算法的时间复杂度 排序算法的时间复杂度通常取决于输入数据的规模&#xff08;通常表示为n&#xff09;。以下是一些常见排序算法及其平均、最好和最坏情况下的时间复杂度&#xff1a; 1、冒泡排序&#xff08;Bubble Sort&#xff09; 平均时间复杂度&#xff1a;…

使用reprepro+nginx搭建apt服务器

目录 项目背景 项目要求 项目开发过程 1、apt服务器的搭建 2、实现自定义指定源文件列表来实现apt update更新 3、实现软件启动时自动更新 4. source.list中镜像源地址的格式 项目开发的难点/坑点 总结 项目背景 前面写过一篇“利用Nginx搭建一个apt服务器”&#xff…

FreeRTOS学习笔记-基于stm32(5)列表和列表项

一、列表与列表项简介 列表是FreeRTOS中的一种数据结构&#xff0c;类似双向循环链表。用来跟踪FreeRTOS中的任务。列表项就是存放在列表中的项目。 二、列表 列表结构体&#xff1a; typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE //校验值c…

闲聊电脑(7)常见故障排查

闲聊电脑&#xff08;7&#xff09;常见故障排查 夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;平时遇到电脑故障该咋处理呢&#xff1f; 冰箱&#xf…