C++ C_style string overview and basic Input funcitons
write in advance
最近在做题,遇到一个简单的将console的输入输出到文件中的简单题目,没有写出来。悔恨当初没有踏实地总结string 相关的 I/O 以及与文件的操作。这篇文章旨在记录基础的字符I/O, 简单常用的文件I/O操作函数。
当然,你会说C++ 已经有一个string class,我们只需要#include<string>就能够使用它带来的便捷性及强大的功能,无需烦恼细节。
但知道底层的具体情况在语言的学习阶段很重要,有利于打好基础。说不定以后需要自己写一个类似的string类呢?此外,#include的方式包含头文件会包含头文件中的所有信息,而有时我们可能只会用到其中的一小部分,这会使我们的文件变得很大。或者,我们可以自己写一个,只包含我们目前需要用的。当然,那是有一定积累之后的事情了。
此处我会试着提供一些代码片段(code snippet),作为例子。
简单的Input 函数
此处比较std::cin.get()函数,理解function overloading 概念。
function overloading指允许同名不同参数列表的函数存在,以不同的方式或不同的参数类型执行相同的基础操作。要重载一个函数,你必须提供不同的参数列表。
//function prototype
int std::cin.get(char ); // read a char argument, return a int type
std::cin std::cin.get(char*,int); // line-oriented function
std::cin std::cin.get(char& ch); // the argument is char&, a reference
// any change to the ch modifys the original variable// a simple output method
std::cout.put(char ); // display the type char character
此处给出几个简单的 line-oriented funcitons.
// both used to read a line, the so-called line-oriented method
// first argument is the name of the target, the second argument is a limit
// on the number of characters to be read// when meeting the newline character, they behave differently
std::cin.get(char*, int ); // leave the newline character in the intput queue
std::cin.getline(char*, int ); // discards the newline character// stop reading input when they reach the numeric limit or when they meet
// a newline character, whichever comes first.std::cin.get() // read the single next character, including the newline character
// it can be used to dispose of the newline character.
两种方法都能够读取一整行内容。
相比之下,getline() 更简单,get()更有利于错误检查。
when std::cin.getline() or std::cin.get() reads an empty line, both sets the failbit, which block further input. To recover from the state , std::cin.clear(); is needed.
if the input line is longer than the num, std::cin.getline() set the failbit and turn off further input while std::cin.get() do nothing. In additon, both of them leave the remaining characters in the input queue. once again, the failbit block further input, which should be reset through statement
std::cin.clear();
值得注意到是,当混合数字、字符串输入时,有时也会遇到 failbit 阻止更多输入的情况。这种情况下,同样需要使用 std::cin.clear();
此处也能够将两个式子连接起来,因为函数的返回值为 std::cin 对象。
//both them returns a cin object
std::cin.get(char*,int);
std::cin.getline(char* int);// so statement like this is available
std::cin.get(char*,int).get();
std::cin.getline(char*,int).get();// in this situation, it is the concatenation
string class 中同样存在读取一整行的函数getline(), 它的两个参数及其意义与 std::cin.getline(char*,int )并不相同。第一个参数说明输入的来源,此处是控制台输入,也可以是文件输入;第二个参数说明要输入哪个string 对象。 注意到getline()是一个函数,不是方法,这是友元函数的概念。
#include<string>
string str;
getline(std::cin, str); // a string class object to read a line// it is a friend function, needn't to take care about the size// cause the stirng class automatically resize when change occure
std::ifstream fin;
fin.open("mytest.txt"); // assume there exist a mytest.txt file, and it is not empty
getline(fin, str); // read a line from mytest.txt to str
以上是简单的line-oriented functions,后续也许会补充。
文件相关的 Input 函数
#include<iostream>
#include<fstream> // for file I/Ostd::ifstream infile;
std::ofstream outfile;
infile.open("test.txt"); infile.clost(); // outfile is the same//check
infile.is_open(); // true if the file is open successfully
infile.good(); // input is good and not at EOF
infile.eof(); // return true when encounter the EOF
infile.fail(); // return ture when encounter the EOF
// or when type mismatch, whichever come first
注意图中给出了部分用于定位错位原因,方便调试。
summary
line-oriented functions 读取一行输入,可以简单理解为读取句子。它和读取单词一样,都是字符串输入的简单函数。
文件是通常情况下我们需要使用的部分。与文件有关的I/O读写也是必须掌握的基础知识。
重定向 redirection 概念在console and file 的交互中产生。我们不仅能从standard input(你的键盘)读取输入,也能从文件中;类似的,不仅能将结果输出到 console (你的显示屏),也能输出到文件中。
现在回看,这篇文章实际内容并不多,是零零碎碎的语法总结。更多的目的,是为了防止以后再出现对简单问题无法正确答出的愚蠢情况。
后期,在更深入了解字符类的输入输出后,会重新回来更新这部分的内容。
added
编程语言 (C++, Python...)与文件有关的操作还与文件的格式、内部的书写相关。须知,.txt文件是最最简单的文本文件。而语言能对文件进行的操作也很繁多。比如 json文件, yaml文件,urdf文件,C++自然能够对它们进行操作。对文件的操作包括解析文件格式,提取特定内容等等部分,对特殊格式的文件读取,如解析json文件,网络上就有开源的用纯C编写的项目,是一项大工程。
所以,这些简单的,易得的,不需要如何动脑子的函数细节,自然需要牢固掌握,日后遇到大项目才不需要哪里都是漏洞。
相关文章:
C++ C_style string overview and basic Input funcitons
write in advance 最近在做题,遇到一个简单的将console的输入输出到文件中的简单题目,没有写出来。悔恨当初没有踏实地总结string 相关的 I/O 以及与文件的操作。这篇文章旨在记录基础的字符I/O, 简单常用的文件I/O操作函数。 当然,你会说C…...
VS2022+Qt雕刻机单片机马达串口上位机控制系统
程序示例精选 VS2022Qt雕刻机单片机马达串口上位机控制系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VS2022Qt雕刻机单片机马达串口上位机控制系统》编写代码,代码整洁&a…...
Android Ble低功耗蓝牙开发
一、新建项目 在Android Studio中新建一个项目,如下图所示: 选择No Activity,然后点击Next 点击Finish,完成项目创建。 1、配置build.gradle 在android{}闭包中添加viewBinding,用于获取控件 buildFeatures {viewB…...
Visual Studio的快捷按键
Visual Studio的快捷按键对于提高编程效率至关重要。以下是一些常用的Visual Studio快捷按键,并按照功能进行分类和归纳: 1. 文件操作 Ctrl O:打开文件Ctrl S:保存文件Ctrl Shift S:全部保存Ctrl N:…...
【WEB系列】过滤器Filter
Filter,过滤器,属于Servlet规范,并不是Spring独有的。其作用从命名上也可以看出一二,拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servl…...
[书生·浦语大模型实战营]——LMDeploy 量化部署 LLM 实践
1.基础作业 1.1配置 LMDeploy 运行环境 创建开发机 创建新的开发机,选择镜像Cuda12.2-conda;选择10% A100*1GPU;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像,新版本的lmdeploy会出现兼容性问题。其他和之前一样&…...
TiDB-从0到1-配置篇
TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇 一、系统配置 TiDB的配置分为系统配置和集群配置两种。 其中系统配置对应TiDB Server(不包含TiKV和PD的参数࿰…...
微信小程序按钮设计与交互:打造极致用户体验
微信小程序作为一种流行的应用形式,其界面设计和交互体验对于用户吸引力和留存率至关重要。其中,按钮作为用户与小程序进行交互的主要方式之一,其设计和实现直接影响到用户体验的质量。在本文中,我们将探讨微信小程序按钮的设计与…...
ES6中如何使用class和extends关键字实现继承?
在ES6中,可以使用class关键字来定义类,使用extends关键字来实现继承。下面是一个示例: // 父类 class Parent {constructor(name) {this.name name;}sayHello() {console.log(Hello, my name is ${this.name});} }// 子类 class Child ex…...
Linux:基本指令
文章目录 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令 && rm指令cp指令man指令echo指令输出重定向追加重定向 cat指令输入重定向 mv指令which指令alias指令more && less指令head && tail指令事件相关的指令date显示时间戳 cal指令find指令grep指令…...
商业C++静态代码检测工具PC-lint Plus 、 polysace和sonarqube对比
商业C静态代码检测工具PC-lint Plus 、 polysace和sonarqube对比 特性/工具PC-lint PlusPolyspaceSonarQube主要功能高精度静态代码分析、编码标准检查高级静态分析和形式验证、优化嵌入式系统综合性代码质量管理、静态分析、技术债务管理集成方式可集成到IDE和构建系统与开发…...
邬家桥公园
文|随意的风 原文地址 我游览过现存规模最大、保存最完整的皇家园林颐和园,瞻仰过拥有世界上最大祭天建筑群的天坛公园,那都是多年前的事情了。 邬家桥公园相比颐和园、天坛公园,气势雄伟倒谈不上。它没有西湖的水平如镜ÿ…...
Flutter 中的 RenderObjectToWidgetAdapter 小部件:全面指南
Flutter 中的 RenderObjectToWidgetAdapter 小部件:全面指南 Flutter 是一个功能强大的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的渲染体系中,RenderObjectToWidgetAdap…...
SNAT与DNAT
一、SNAT策略概述 1、SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet(私有IP不能在Internet中正常路由) 局域共享上网 2、 SNAT 策略的原理 修改数据包的源地址 把从内网 --> 外网的数据的源内网地址转换成公网源地址 3、SN…...
MySql八股文知识点总结,一篇文章让mysql成为面试加分项
MySql八股文知识点总结(自检) 1.前言 参与了几次中大厂的面试,你会发现一面时对于八股文的考察也具有侧重点(MySQLRedis > 网络 > 系统 >设计模式 > java集合 >spring) 本文的目标就是通过这一篇文章让你能在面…...
Python 很好用的爬虫框架:Scrapy:
了解Scrapy 爬虫框架的工作流程: 在scrapy中, 具体工作流程是这样的: 首先第一步 当爬虫引擎<engine>启动后, 引擎会到 spider 中获取 start_url<起始url> 然后将其封装为一个request对象, 交给调度器<…...
C/C++|关于 namespace 在C++中的代码组织
命名空间(namespace)在C中用于组织代码,避免命名冲突,并提供更好的代码结构和可读性。下面详细解释命名空间在C多文件编写中的各种作用和表达。 基本概念 命名空间是一个声明区域,用于组织代码,防止不同部…...
selenium自动化测试入门 —— 上传文件
selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素。 上传文件有两种场景:input控制上传和非input控件上传。 大多数情况都是input控件上传文件,只有非常少数的使用自定义的非input上传文件。 一、input控…...
C# Math.Round() 四舍六入五取偶
文章目录 1.重载列表2. 示例 Math.Round() 为四舍六入五取偶 1.重载列表 API说明Round(Double)将小数值舍入到最近的整数值Round(Double, Int32)将小数值按指定的小数位数舍入Round(Double, Int32, MidpointRounding)将小数值按指定的小数位数舍入,MidpointRoundin…...
springboot手动触发参数校验,service层调用参数校验
背景 入参校验一般是在控制层通过javax.validation.constraints包下的规则注解如NotNull结合Valid与Validated实现,但是有时候我们的方法不提供给controller调用,这时候就无法触发自动参数校验,为此我们可以在不更改校验代码的前提下手动触发…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
