C++学习笔记——输入、输出和文件

目录

一、标准输入输出

2.1下面是它们的基本用法

解释

二、格式化输入输出

2.2下面是一个示例

解释

三、文件读写

3.3下面是一个文件读写的示例

解释

四、异常处理和错误检测

4.1下面是一个示例

解释

五、一个实例代码

5.1如何读取 CSV 文件,并计算每一列的平均值


上一篇文章链接:

C++ 是一门功能强大的编程语言,它提供了很多工具来实现各种编程任务。在本文中,我们将介绍 C++ 中的三个重要概念:友元、嵌套类和异常。

C++学习笔记——友元、嵌套类、异常-CSDN博客文章浏览阅读20次。友元、嵌套类和异常是 C++ 中三个重要的概念,它们可以提高程序的灵活性、封装性和健壮性。但是,需要注意的是过度使用它们会破坏程序的封装性、增加代码的复杂度和影响程序的性能。因此,在编写程序时,应根据实际情况选择适当的编程技术来提高程序的可读性、可维护性和可靠性。https://blog.csdn.net/m0_62338174/article/details/135573148?spm=1001.2014.3001.5502

 

    C++ 是一种功能强大的编程语言,它提供了丰富的输入、输出和文件操作功能,使得开发者能够方便地与用户交互、读写数据以及进行文件处理。本篇博客将详细介绍 C++ 的输入输出流(iostream)库,并给出代码示例和详细解释,帮助读者深入理解 C++ 中的输入输出和文件操作。

一、标准输入输出

标准输入流(cin)和标准输出流(cout)是 C++ 中常用的标准输入输出方式。

2.1下面是它们的基本用法

#include <iostream>int main() {int age;std::cout << "请输入您的年龄:";std::cin >> age;std::cout << "您的年龄是:" << age << std::endl;return 0;
}

解释

std::cin 用于从标准输入流读取数据。

std::cout 用于向标准输出流输出数据。

>> 运算符用于从输入流中提取数据。

<< 运算符用于将数据插入到输出流中。

std::endl 用于在输出流中插入换行符。

二、格式化输入输出

C++ 提供了格式化标志和操纵算子,可以控制输入输出的格式。

2.2下面是一个示例

#include <iostream>
#include <iomanip>int main() {double pi = 3.14159;std::cout << "圆周率:" << std::setprecision(4) << pi << std::endl;int num = 10;std::cout << "数字:" << std::setw(5) << std::setfill('0') << num << std::endl;return 0;
}

解释

std::setprecision 设置输出浮点数的精度。

std::setw 设置输出字段的宽度。

std::setfill 设置填充字符。

三、文件读写

操作 C++ 允许我们使用文件流来读写文件。

3.3下面是一个文件读写的示例

#include <iostream>
#include <fstream>int main() {// 写入文件std::ofstream outfile("data.txt");if (outfile.is_open()) {outfile << "Hello, World!";outfile.close();} else {std::cout << "无法打开文件" << std::endl;}// 读取文件std::ifstream infile("data.txt");std::string line;if (infile.is_open()) {while (getline(infile, line)) {std::cout << line << std::endl;}infile.close();} else {std::cout << "无法打开文件" << std::endl;}return 0;
}

解释

std::ofstream 用于写入文件。

std::ifstream 用于读取文件。

is_open() 函数用于检查文件是否成功打开。

getline 函数用于逐行读取文件内容。

四、异常处理和错误检测

在文件操作过程中,我们需要进行异常处理和错误检测,以保证程序的健壮性。

4.1下面是一个示例

#include <iostream>
#include <fstream>int main() {std::ofstream outfile("data.txt");if (!outfile) {std::cerr << "无法打开文件" << std::endl;return 1;}try {// 写入文件outfile << "Hello, World!";outfile.close();// 读取文件std::ifstream infile("data.txt");if (!infile) {throw std::runtime_error("无法打开文件");}std::string line;while (getline(infile, line)) {std::cout << line << std::endl;}infile.close();} catch (const std::exception& e) {std::cerr << "发生错误:" << e.what() << std::endl;return 1;}return 0;
}

解释

使用 std::cerr 输出错误信息。

使用 try-catch 块捕获并处理可能的异常。

使用 throw 抛出自定义异常。

五、一个实例代码

5.1如何读取 CSV 文件,并计算每一列的平均值

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>int main() {std::ifstream infile("data.csv");if (!infile) {std::cerr << "无法打开文件" << std::endl;return 1;}std::string line;std::vector<std::vector<double>> data;int num_cols = 0;while (getline(infile, line)) {std::stringstream ss(line);std::vector<double> row;double val;while (ss >> val) {row.push_back(val);if (ss.peek() == ',') {ss.ignore();}}if (num_cols == 0) {num_cols = row.size();} else if (row.size() != num_cols) {std::cerr << "数据格式不正确" << std::endl;return 1;}data.push_back(row);}infile.close();for (int j = 0; j < num_cols; ++j) {double sum = 0.0;for (int i = 0; i < data.size(); ++i) {sum += data[i][j];}double avg = sum / data.size();std::cout << "第 " << j + 1 << " 列的平均值为:" << avg << std::endl;}return 0;
}

解释:

  • std::ifstream 用于读取文件。
  • getline 函数用于逐行读取文件内容。
  • 使用 std::stringstream 将每行内容转换为一个 double 类型的 vector。
  • 检查数据格式是否正确,保证每一行的列数相同。
  • 使用二维 vector 存储数据。
  • 计算每一列的平均值。

除此之外,还有一些最佳实践和注意事项:

  1. 输入输出操作需要谨慎处理,避免出现死循环或者读写错误等问题。
  2. 在进行文件读写操作时,需要确保文件存在,并且需要考虑文件权限等问题。
  3. 在读取 CSV 文件等格式化数据时,需要特别注意数据格式的一致性,避免出现数据错误或程序崩溃等情况。
  4. 在进行异常处理时,需要尽可能详细地输出错误信息,以便快速定位问题。
  5. 在进行文件读写操作时,需要及时关闭文件流,释放资源。
  6. 在进行大量数据处理时,需要考虑内存占用等问题,避免出现程序崩溃等情况。
  7. 在进行输入输出和文件操作时,需要充分利用 C++ STL 提供的丰富功能和算法库,以提高开发效率和程序质量。

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

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

相关文章

【数据结构】交换排序

插入排序链接。 这篇文章讲解交换排序的两种排序&#xff1a;冒泡排序与快速排序。 目录 冒泡排序&#xff1a;完整代码&#xff1a; 快速排序&#xff1a;单趟排序&#xff1a;hoare&#xff1a;挖坑&#xff1a;前后指针&#xff1a; 完整代码&#xff08;3种方式&#xff0…

从零开发短视频电商 PaddleOCR Java推理 (二)优化Translator模型输入和输出

PaddleOCR提供了一系列测试图片&#xff0c;你可以通过点击这里来下载。 值得注意的是&#xff0c;PaddleOCR的模型更新速度远远快于DJL&#xff0c;这导致了一些DJL的优化滞后问题。因此&#xff0c;我们需要采取一些策略来跟上PaddleOCR的最新进展。 针对文本识别模型&…

3 - AOP

1. 快速入门 1.1 基本说明 AOP(aspect oriented programming) &#xff0c;面向切面编程 切面类中声明通知方法&#xff1a; 前置通知&#xff1a;Before返回通知&#xff1a;AfterReturning异常通知&#xff1a;AfterThrowing后置通知&#xff1a;After环绕通知&#xff1…

2、Redis持久化、主从与哨兵:构建强大而稳定的数据生态

Redis作为一款高性能的内存数据库&#xff0c;其在持久化、主从复制和哨兵系统方面的支持使其在大规模应用和高可用性场景中脱颖而出。本文将深入探讨Redis的持久化机制、主从复制以及哨兵系统&#xff0c;为构建强大而稳定的数据生态揭示关键技术。 持久化&#xff1a;数据的…

http状态码对照表

状态码含义100客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收&#xff0c;且仍未被拒绝。客户端应当继续发送请求的剩余部分&#xff0c;或者如果请求已经完成&#xff0c;忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。…

开发React应用的多语言支持最佳实践

前言 VoerkaI18n是一款非常优秀的全新的开源国际化多语言解决方案&#xff0c;主要特性包括&#xff1a; 全面工程化解决方案&#xff0c;提供初始化、提取文本、自动翻译、编译等工具链支持。符合直觉&#xff0c;不需要手动定义文本Key映射。强大的插值变量格式化器机制&am…

二进制与十六进制,二进制与八进制之间的相互转换技巧

目录 1.二进制转换为八进制 2.八进制转换为二进制 3.二进制转换为十六进制 4.十六进制转换为二进制 1.二进制转换为八进制 转换为8进制 第一步&#xff1a;以小数点为分界线&#xff0c;整数部分自右向左&#xff0c;小数部分自左向右每3位取成1位&#xff1a; 整数部分…

【python入门】day28:记录用户登录日志

演示 代码 #-*- coding:utf-8 -*- print(记录用户登录日志----------------------------) import time def show_info():print(输入提示数字,执行相应操作:0退出,1查看登录日志) def write_logininfo(username):#----------记录日志with open(log.txt,a,encodingutf-8)as file…

如何高效阅读Linux的man page

有时候需要在man page中查某个命令的用法&#xff0c;我们一般会使用man command的方式来查询&#xff0c;例如man vmstat.但是对于一些bash内置的命令&#xff0c;如alias,如果使用man alias会打开General Commands Manual ,如下图 可以看到&#xff0c;内置命令很多&#xff…

COBOL语言 :一种主要专注于解决业务问题的编程语言

译文&#xff1a; 什么是COBOL? COBOL是一种主要专注于解决业务问题的编程语言。COBOL的完整形式是面向业务的通用语言。它主要用于公司和政府的商业、金融和行政系统。这种语言也被用来解决许多数据处理问题。 它是由CODASYL(数据系统语言会议)开发的。它被用作大型机中的一…

基于 InternLM 和 LangChain 搭建你的知识库

如何打造垂域大模型是一个重要落地方向。 如何打造个人专属的大模型应用也是重要的问题。 RAG 外挂一个知识库 优势&#xff1a;成本低&#xff0c;实时更新 劣势&#xff1a;能力受基座模型影响大&#xff0c;RAG每次需要将检索文档和问题提交给大模型&#xff0c;极大占用上下…

工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

C++力扣题目701--二叉搜索树中的插入操作

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效的插入方式&a…

苏州倍丰智能新型雾化粉末技术量产成功!金属3D打印全产业链更进一步

苏州倍丰智能深耕金属3D打印技术领域&#xff0c;以金属3D打印全产业链为目标&#xff0c;围绕金属3D打印设备&#xff0c;涵盖包括金属粉末前后处理设备、金属粉末原材料制备、先进工艺研发等多个领域&#xff0c;完成了一整条自上而下的金属3D打印全产业链。 近日&#xff0c…

大数据Doris(五十四):SQL函数之日期函数(二)

文章目录 SQL函数之日期函数(二) 一、DAYOFMONTH(DATETIME date) 二、dayofweek(DATETIME date)

HarmonyOS 通过 animateTo讲解尺寸动画效果

上文 HarmonyOS讲解并演示 animateTo 动画效果 我们已经做出了基本的动画效果 也对 animateTo 的使用比较熟悉了 第一个参数是 配置动画参数的json 第二个参数 则是改变我们元素属性值的事件 但属性值 远远不止位置属性 本文 我们来说 通过尺寸变化 完成动画效果 如果你有看过…

代码随想录算法训练营第4天 | 24. 两两交换链表中的节点 , 19.删除链表的倒数第N个节点 , 面试题 02.07. 链表相交 , 142.环形链表II

链表知识基础 文章链接&#xff1a;https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html# 24. 两两交换链表中的节点 题目链接&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/ 使用虚拟头结点&#xff0c;这样会方便很…

Promise和箭头函数和普通函数的区别

\1. Promise 的理解 Promise 是一种为了避免回调地狱的异步解决方案 2. Promise 是一种状态机&#xff1a; pending&#xff08;进行中&#xff09;、fulfilled&#xff08;已成功&#xff09;和rejected&#xff08;已失败&#xff09; 只有异步操作的结果&#xff0c;可以决…

Centos7编译Python3.11源码并安装完成的详细教程

Python3.11的Linux源码&#xff1a; Index of /ftp/python/https://www.python.org/ftp/python/由于Centos7里自带的openssl是1.0版本的&#xff0c;而Centos Stream8和9用的是openssl-1.1.1版本的。 注意&#xff1a;openssl必须是openssl-1.1.1版本的&#xff0c;虽然最高版…

QT的事件机制

QT的事件机制 文章目录 QT的事件机制 1、QT的事件机制。2、QT事件的整体流程。1、事件处理函数。1、鼠标按下与鼠标释放事件。2、事件的接收与忽略(accept()和ignore()函数&#xff09;。 2.事件的分发enevt()1、事件分发的dome。2、enevt事件的缺点。 3、事件的过滤器。 3、总…