当前位置: 首页 > news >正文

输入输出--I/O流【C++提升】()

1.1基础知识:

在C++中,输入输出(IO)流是通过标准库中的 <iostream> 头文件来处理的。C++ 提供了几种基本的输入输出流类,最常用的有以下几种:

  1. std::cin:用于输入。
  2. std::cout:用于输出。
  3. std::cerr:用于输出错误信息(无缓冲)。
  4. std::clog:用于输出日志信息(缓冲)。

基本使用示例

下面是一个简单的例子,展示如何使用这些 IO 流进行输入输出操作。

#include <iostream>  
#include <string>  int main() {  std::string name;  int age;  // 输出提示信息  std::cout << "请输入您的名字: ";  std::cin >> name; // 从标准输入读取名字  std::cout << "请输入您的年龄: ";  std::cin >> age; // 从标准输入读取年龄  // 输出结果  std::cout << "你好, " << name << "!你今年 " << age << " 岁。" << std::endl;  return 0;  
}

详细说明

  • 输入: 使用 std::cin 时,可以用 >> 运算符来读取不同类型的数据。默认情况下,它会忽略空白字符(空格、换行符等),直到遇到下一个有效的输入。

  • 输出: 使用 std::cout 进行输出时,可以用 << 运算符将多个数据连接在一起,可以很方便地输出多个变量及文本。

  • 错误输出std::cerr 和 std::clog 都用于输出错误信息,区别在于 std::cerr 是无缓冲的,意味着内容会立即输出,而 std::clog 是有缓冲的,可能会延迟输出。

注意事项

  1. 输入输出通常是在控制台进行的,要保证控制台能够接收和显示中文字符,可能需要设置locale。
  2. 使用 std::endl 时,它会在输出流中插入一个换行符,并刷新输出缓冲区。如果只需要换行,可以使用 \n,这样会提高效率,因为不一定每次都需要刷新。

1.2高级特性:

自定义输出格式

C++ 提供了多种方式来控制输出格式。你可以使用格式化标志和流操作符来改变输出格式。

#include <iostream>  
#include <iomanip> // 用于 std::setprecision 和 std::fixed  int main() {  double number = 123.456789;  std::cout << std::fixed << std::setprecision(2) << number << std::endl; // 输出 123.46  return 0;  
}

 流状态管理

C++ 允许你检查和管理流的状态。你可以检查流是否处于有效状态,是否发生了错误,是否到达文件结束等。

#include <iostream>  
#include <fstream>  int main() {  std::ifstream inFile("test.txt");  if (!inFile) {  std::cerr << "无法打开文件。" << std::endl;  return 1;  }  std::string line;  while (std::getline(inFile, line)) {  std::cout << line << std::endl;  }  if (inFile.eof()) {  std::cout << "到达文件结束。" << std::endl;  }  if (inFile.fail()) {  std::cout << "读取时发生错误。" << std::endl;  }  inFile.close();  return 0;  
}

流操作符的重载

你可以通过重载 << 和 >> 运算符来自定义对象的输入输出。

#include <iostream>  
#include <string>  class Person {  
public:  std::string name;  int age;  // 重载 << 运算符  friend std::ostream& operator<<(std::ostream& os, const Person& p) {  return os << p.name << " " << p.age;  }  // 重载 >> 运算符  friend std::istream& operator>>(std::istream& is, Person& p) {  return is >> p.name >> p.age;  }  
};  int main() {  Person p{"Alice", 30};  std::cout << p << std::endl; // 输出:Alice 30  Person p2;  std::cin >> p2; // 输入格式:<名字> <年龄>  std::cout << p2 << std::endl;   return 0;  
}

文件流异常处理

通过设置文件流的异常标志,可以更好地管理文件操作中的错误。

#include <iostream>  
#include <fstream>  int main() {  std::ifstream inFile;  inFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); // 设置异常标志  try {  inFile.open("nonexistent.txt"); // 尝试打开不存在的文件  } catch (const std::ifstream::failure& e) {  std::cerr << "异常: " << e.what() << std::endl;  }  return 0;  
}

使用字符串流

C++ 还提供了 std::ostringstream 和 std::istringstream 类,可以在内存中进行字符串流操作。

#include <iostream>  
#include <sstream>  int main() {  std::ostringstream oss; // 输出字符串流  oss << "Hello, " << "World! " << 2023;  std::string str = oss.str(); // 获取字符串  std::cout << str << std::endl; // 输出:Hello, World! 2023  std::istringstream iss(str); // 输入字符串流  std::string word;  while (iss >> word) { // 从字符串中读取单词  std::cout << word << std::endl;  }  return 0;  
}

文件缓冲管理

可以使用 std::ifstream 和 std::ofstream 的成员函数 rdbuf(),进行流缓冲区的操作。例如,你可以直接操作底层缓冲区,或者在特定情况下改变缓冲方式。

#include <iostream>  
#include <fstream>  int main() {  std::ofstream outFile("example.txt");  // 手动设置缓冲区  std::streambuf* originalBuf = std::cout.rdbuf(outFile.rdbuf());  std::cout << "这行将写入文件 example.txt" << std::endl;  // 恢复原来的缓冲区  std::cout.rdbuf(originalBuf);  std::cout << "这行将写入控制台" << std::endl;  return 0;  
}

使用标准库算法与流结合

可以将标准库算法与输入输出流结合使用,例如.sort()std::copy() 等,可以更加高效地处理数据。

#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <iterator>  int main() {  std::vector<int> numbers = {5, 3, 4, 1, 2};  std::sort(numbers.begin(), numbers.end());  std::cout << "排序后的数字: ";  std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));  std::cout << std::endl;  return 0;  
}

 2.1文件操作:

在C++中,除了标准输入输出流(如std::cinstd::cout)外,文件输入输出也是常用的功能。可以通过标准库中的 <fstream> 头文件来处理文件的读取和写入。

文件操作基础

C++ 提供了以下几个主要的文件流类:

  1. std::ifstream:输入文件流,用于从文件中读取数据。
  2. std::ofstream:输出文件流,用于向文件中写入数据。
  3. std::fstream:文件流,可以同时用于读取和写入操作。

基本使用示例

以下是一个简单的示例,展示如何使用这几个类进行文件操作。

写入文件:

#include <iostream>  
#include <fstream>  
#include <string>  int main() {  std::ofstream outFile("output.txt"); // 创建输出文件流  if (!outFile) { // 检查文件是否成功打开  std::cerr << "无法打开文件进行写入。" << std::endl;  return 1;  }  outFile << "这是一行文本。\n";  outFile << "这是文件中的第二行。" << std::endl;  outFile.close(); // 关闭文件流  return 0;  
}

 读取文件:

#include <iostream>  
#include <fstream>  
#include <string>  int main() {  std::ifstream inFile("output.txt"); // 创建输入文件流  if (!inFile) { // 检查文件是否成功打开  std::cerr << "无法打开文件进行读取。" << std::endl;  return 1;  }  std::string line;  while (std::getline(inFile, line)) { // 逐行读取文件  std::cout << line << std::endl; // 输出到控制台  }  inFile.close(); // 关闭文件流  return 0;  
}

2.2高级特性:

文件打开模式:

可以指定打开文件的方式,如只读、只写、追加等。可以通过组合打开模式标志来实现,例如:

std::ofstream outFile("output.txt", std::ios::app); // 追加模式

 常用的模式标志有:

  • std::ios::in:打开文件用于读取。
  • std::ios::out:打开文件用于写入。
  • std::ios::app:以追加方式打开文件。
  • std::ios::trunc:打开文件时,如果文件存在,则先清空文件。
  • std::ios::binary:以二进制模式打开文件。

异常处理:

可以使用异常机制来处理文件操作中的错误。通过在文件流中设置异常标志:

std::ifstream inFile("somefile.txt");  
inFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);

 这将使得在文件打开或读取失败时抛出异常。

二进制文件的读写:

使用 std::ios::binary 打开文件,可以进行二进制数据的读写操作。例如,写入和读取基本数据类型或对象(如结构体)。

对象序列化:

可以通过重载 << 和 >> 运算符来实现自定义对象的输入输出。

class Person {  
public:  std::string name;  int age;  friend std::ostream& operator<<(std::ostream& os, const Person& p) {  os << p.name << " " << p.age;  return os;  }  friend std::istream& operator>>(std::istream& is, Person& p) {  is >> p.name >> p.age;  return is;  }  
};

3.0模拟实现:

模拟目标:

我们将创建一个名为 MyStream 的类,模拟 C++ 的输入输出流。这个类将支持字符串的读取和写入,并维护一个内部缓冲区。

代码示例: 

#include <iostream>  
#include <string>  
#include <sstream>  class MyStream {  
private:  std::string buffer;      // 内部缓冲区  size_t position;         // 当前读取位置  public:  MyStream() : position(0) {}  // 写入字符串到缓冲区  void write(const std::string& str) {  buffer += str;       // 追加字符串到缓冲区  }  // 从缓冲区读取字符串  bool read(std::string& outStr) {  if (position >= buffer.size()) {  return false; // 没有更多数据可读  }  // 查找下一个空格  size_t nextSpace = buffer.find(' ', position);  if (nextSpace == std::string::npos) {  nextSpace = buffer.size(); // 到达字符串末尾  }  // 提取子字符串  outStr = buffer.substr(position, nextSpace - position);  position = nextSpace + 1; // 更新当前位置  return true; // 成功读取  }  // 清空缓冲区  void clear() {  buffer.clear();  position = 0;  }  // 打印当前缓冲区的内容  void print() const {  std::cout << "Buffer: " << buffer << ", Position: " << position << std::endl;  }  
};  int main() {  MyStream myStream;  // 写入数据到自定义流  myStream.write("Hello World from MyStream");  myStream.print();  // 读取数据  std::string word;  while (myStream.read(word)) {  std::cout << "Read: " << word << std::endl;  }  // 再次写入新的数据  myStream.write("Another line");  myStream.print();  // 在读取新数据之前清空流  myStream.clear();  myStream.print();  // 再次写入数据  myStream.write("After clearing the buffer");  myStream.print();  // 读取新数据  while (myStream.read(word)) {  std::cout << "Read: " << word << std::endl;  }  return 0;  
}
  1. MyStream 类:

    • buffer 用于保存写入的数据。
    • position 用于记录当前读取的位置。
    • write 方法用于向缓冲区添加字符串。
    • read 方法用于从缓冲区读取下一个词并更新读取位置。如果没有可读的数据,返回 false
    • clear 方法用于清空缓冲区和重置位置。
    • print 方法用于打印当前的缓冲区内容和位置。
  2. main 函数:

    • 创建 MyStream 对象并写入示例字符串。
    • 读取缓冲区中的单词并打印。
    • 清空缓冲区后再次写入并读取。

尽管这只是一个基础示例,但它揭示了流机制的基本概念,如缓冲、读取位置和字符串处理。


感谢大家!

相关文章:

输入输出--I/O流【C++提升】()

1.1基础知识&#xff1a; 在C中&#xff0c;输入输出&#xff08;IO&#xff09;流是通过标准库中的 <iostream> 头文件来处理的。C 提供了几种基本的输入输出流类&#xff0c;最常用的有以下几种&#xff1a; std::cin&#xff1a;用于输入。std::cout&#xff1a;用于…...

Maven 中央仓库地址推荐

目录 Maven 中央仓库地址推荐 Maven Maven 中央仓库概述 什么是 Maven 中央仓库&#xff1f; 中央仓库的作用 常用的 Maven 中央仓库地址 官方 Maven 中央仓库 阿里云 Maven 中央仓库镜像 腾讯云 Maven 中央仓库镜像 网易 Maven 中央仓库镜像 华为云 Maven 中央仓库…...

Fastgpt本地化部署 - 以MAC为例

1.认识fastgpt 2.私有化部署 MongoDB&#xff1a;用于存储除了向量外的各类数据PostgreSQL/Milvus&#xff1a;存储向量数据OneAPI: 聚合各类 AI API&#xff0c;支持多模型调用 &#xff08;任何模型问题&#xff0c;先自行通过 OneAPI 测试校验&#xff09; &#xff08;1&a…...

SpringBoot框架下购物推荐网站的设计模式与实现

3系统分析 3.1可行性分析 通过对本东大每日推购物推荐网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本东大每日推购物推荐网站采用JAVA作为开发语言&…...

Apache Flink 和 Apache Kafka

Apache Flink 和 Apache Kafka 都是大数据生态系统中非常重要的工具&#xff0c;但它们的作用和应用场景有所不同。下面将分别介绍两者的主要特性和它们之间的异同点。 Apache Kafka 作用&#xff1a; 消息队列&#xff1a;Kafka 主要作为消息队列使用&#xff0c;用于解耦生…...

Excel中Ctrl+e的用法

重点&#xff1a;想要使用ctrle&#xff0c;前提是整合或拆分后的结果放置的单元格必须和被提取信息的单元格相邻&#xff0c;且被提取信息的单元格也必须相连。 下图为错误示例 这样则可以使用ctrle 1、信息整合 2、提取信息 3、添加符号 4、信息顺序调换 5、数字提取 crtle还…...

07-Cesium动态处理线条闪烁材质的属性

这段代码定义了 LineFlickerMaterialProperty 类,用于管理线条闪烁材质的属性。构造函数接收颜色和速度作为选项,类包含动态属性 isConstant 和 definitionChanged,以及获取材质类型和当前属性值的方法。getValue 方法返回颜色和速度的当前值,equals 方法用于比较两个实例是…...

postgresql16分区表解析

PostgreSQL 16 引入了对分区表的多项改进&#xff0c;增强了其性能和可用性。本文介绍PostgreSQL 16 中分区表功能&#xff0c;包括基本概念、创建方法、管理技巧以及一些最佳实践。 分区表的基本概念 分区表是一种将大表物理分割成更小、更易管理的部分的技术。每个部分称为…...

文字识别解决方案-OCR识别应用场景解析

光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;技术是一种将图像中的文字转换为可编辑和可搜索的数据的技术。随着人工智能和机器学习的发展&#xff0c;OCR技术的应用场景越来越广泛&#xff0c;为文字录入场景带来了革命性的变革&#xff0c;下面以…...

Qt 每日面试题 -9

81、请写一个调用消息对话框提示报错的程序 QMessageBox::waring(this,tr("警告"), tr("用户名或密码错误!"),QMessageBox::Yes)82、Qt都提供哪些标准对话框以供使用&#xff0c;他们实现什么功能? Qt提供9个标准对话框: QColorDialog 颜色对话框&…...

K8s环境下使用sidecar模式对EMQX的exhook.proto 进行流量代理

背景 在使用emqx作为mqtt时需要我们需要拦截client的各种行为&#xff0c;如连接&#xff0c;发送消息&#xff0c;认证等。除了使用emqx自带的插件机制。我们也可以用多语言-钩子扩展来实现这个功能&#xff0c;但是目前emqx仅仅支持单个grpc服务端的设置&#xff0c;所以会有…...

Dirble:一款高性能目录扫描与爬取工具

今天给大家介绍的是一款名叫Dirble工具&#xff0c;它是一款易于使用的高性能网站目录扫描工具。该工具针对Windows和Linux平台设计&#xff0c;在Dirble的帮助下&#xff0c;广大安全研究人员可以快速对目标站点进行目录扫描和资源爬取。 工具安装 广大研究人员可以使用下列…...

C#语言基础

GitHub - babbittry/Csharp-notes: C# 课程笔记https://github.com/babbittry/Csharp-notes?tabreadme-ov-file#net%E6%98%AF%E4%BB%80%E4%B9%88 C# 数据类型 | 菜鸟教程 (runoob.com)https://www.runoob.com/csharp/csharp-data-types.html 语法基础 一、命名空间、类、方…...

网络分析仪——提升网络性能的关键工具

目录 什么是网络分析仪&#xff1f; 1. 实时流量监控 2. 历史数据回溯分析 3. 网络性能关键指标监测 4. 可视化界面与报告生成 总结 在当今的数字化世界&#xff0c;网络的稳定性和性能直接影响企业的运营效率。网络拥堵、延迟和丢包等问题会导致用户体验的下降&#xff…...

简单认识Maven 1

1.基本概念 Maven 是一个开源的项目管理和构建工具&#xff0c;主要用于 Java 项目&#xff0c;但也支持其他基于 JVM&#xff08;Java Virtual Machine&#xff09;的项目&#xff0c;如 Scala、Groovy 等。它基于项目对象模型&#xff08;Project Object Model&#xff0c;P…...

鼠标右键删除使用Visual Studio 打开(v)以及恢复【超详细】

鼠标右键删除使用Visual Studio 打开&#xff08;v&#xff09; 1. 引言2. 打开注册表3. 进入对应的注册表地址4. 右键删除 AnyCode 项5. 效果6. 备份注册表文件——恢复菜单 1. 引言 安装完 Visual Studio 鼠标右键总有 “使用Visual Studio 打开(v)”&#xff0c;让右键菜单…...

如何缩短微商城系统推广周期

前言 微商城系统的推广周期是企业关注的重点之一。为了缩短推广周期&#xff0c;企业需要采取一系列有效的策略和措施。以下是对如何缩短微商城系统推广周期的详细介绍&#xff1a; 一、明确目标用户群体 在推广之前&#xff0c;企业需要明确自己的目标用户群体是谁&#xf…...

电脑如何清理重复文件?方法很简单!

清理重复文件能够有效释放存储空间&#xff0c;提高系统运行效率。长期堆积的重复文件会导致硬盘空间不足&#xff0c;从而影响系统性能。此外&#xff0c;清理文件还能帮助用户更好地管理和组织文件&#xff0c;避免因文件混乱而浪费时间。 常见的重复文件类型 重复文件可以是…...

【Linux】ioctl分析

简介 一个字符设备驱动通常会实现常规的open、release、read和write接口&#xff0c;但是如果需要扩展新的功能&#xff0c;通常以ioctl接口的方式实现。 #mermaid-svg-uY8EyPklf5e4ZMQo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…...

物联网通信会给人们的生活带来什么样的变化

物联网&#xff08;IoT&#xff09;通信的崛起正以前所未有的速度改变着人们的生活方式。从智能家居、智能交通到远程医疗、工业自动化&#xff0c;物联网技术的应用已经渗透到我们日常生活的方方面面。以下是对物联网通信如何具体影响并改变人们生活的详细探讨。 一、智能家居…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...