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

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 最近在做题&#xff0c;遇到一个简单的将console的输入输出到文件中的简单题目&#xff0c;没有写出来。悔恨当初没有踏实地总结string 相关的 I/O 以及与文件的操作。这篇文章旨在记录基础的字符I/O, 简单常用的文件I/O操作函数。 当然&#xff0c;你会说C…...

VS2022+Qt雕刻机单片机马达串口上位机控制系统

程序示例精选 VS2022Qt雕刻机单片机马达串口上位机控制系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VS2022Qt雕刻机单片机马达串口上位机控制系统》编写代码&#xff0c;代码整洁&a…...

Android Ble低功耗蓝牙开发

一、新建项目 在Android Studio中新建一个项目&#xff0c;如下图所示&#xff1a; 选择No Activity&#xff0c;然后点击Next 点击Finish&#xff0c;完成项目创建。 1、配置build.gradle 在android{}闭包中添加viewBinding&#xff0c;用于获取控件 buildFeatures {viewB…...

Visual Studio的快捷按键

Visual Studio的快捷按键对于提高编程效率至关重要。以下是一些常用的Visual Studio快捷按键&#xff0c;并按照功能进行分类和归纳&#xff1a; 1. 文件操作 Ctrl O&#xff1a;打开文件Ctrl S&#xff1a;保存文件Ctrl Shift S&#xff1a;全部保存Ctrl N&#xff1a;…...

【WEB系列】过滤器Filter

Filter&#xff0c;过滤器&#xff0c;属于Servlet规范&#xff0c;并不是Spring独有的。其作用从命名上也可以看出一二&#xff0c;拦截一个请求&#xff0c;做一些业务逻辑操作&#xff0c;然后可以决定请求是否可以继续往下分发&#xff0c;落到其他的Filter或者对应的Servl…...

[书生·浦语大模型实战营]——LMDeploy 量化部署 LLM 实践

1.基础作业 1.1配置 LMDeploy 运行环境 创建开发机 创建新的开发机&#xff0c;选择镜像Cuda12.2-conda&#xff1b;选择10% A100*1GPU&#xff1b;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像&#xff0c;新版本的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&#xff08;不包含TiKV和PD的参数&#xff0…...

微信小程序按钮设计与交互:打造极致用户体验

微信小程序作为一种流行的应用形式&#xff0c;其界面设计和交互体验对于用户吸引力和留存率至关重要。其中&#xff0c;按钮作为用户与小程序进行交互的主要方式之一&#xff0c;其设计和实现直接影响到用户体验的质量。在本文中&#xff0c;我们将探讨微信小程序按钮的设计与…...

ES6中如何使用class和extends关键字实现继承?

在ES6中&#xff0c;可以使用class关键字来定义类&#xff0c;使用extends关键字来实现继承。下面是一个示例&#xff1a; // 父类 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和构建系统与开发…...

邬家桥公园

文&#xff5c;随意的风 原文地址 我游览过现存规模最大、保存最完整的皇家园林颐和园&#xff0c;瞻仰过拥有世界上最大祭天建筑群的天坛公园&#xff0c;那都是多年前的事情了。 邬家桥公园相比颐和园、天坛公园&#xff0c;气势雄伟倒谈不上。它没有西湖的水平如镜&#xff…...

Flutter 中的 RenderObjectToWidgetAdapter 小部件:全面指南

Flutter 中的 RenderObjectToWidgetAdapter 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的渲染体系中&#xff0c;RenderObjectToWidgetAdap…...

SNAT与DNAT

一、SNAT策略概述 1、SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet&#xff08;私有IP不能在Internet中正常路由&#xff09; 局域共享上网 2、 SNAT 策略的原理 修改数据包的源地址 把从内网 --> 外网的数据的源内网地址转换成公网源地址 3、SN…...

MySql八股文知识点总结,一篇文章让mysql成为面试加分项

MySql八股文知识点总结&#xff08;自检&#xff09; 1.前言 参与了几次中大厂的面试&#xff0c;你会发现一面时对于八股文的考察也具有侧重点&#xff08;MySQLRedis > 网络 > 系统 >设计模式 > java集合 >spring) 本文的目标就是通过这一篇文章让你能在面…...

Python 很好用的爬虫框架:Scrapy:

了解Scrapy 爬虫框架的工作流程&#xff1a; 在scrapy中&#xff0c; 具体工作流程是这样的&#xff1a; 首先第一步 当爬虫引擎<engine>启动后&#xff0c; 引擎会到 spider 中获取 start_url<起始url> 然后将其封装为一个request对象&#xff0c; 交给调度器<…...

C/C++|关于 namespace 在C++中的代码组织

命名空间&#xff08;namespace&#xff09;在C中用于组织代码&#xff0c;避免命名冲突&#xff0c;并提供更好的代码结构和可读性。下面详细解释命名空间在C多文件编写中的各种作用和表达。 基本概念 命名空间是一个声明区域&#xff0c;用于组织代码&#xff0c;防止不同部…...

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…...

C# Math.Round() 四舍六入五取偶

文章目录 1.重载列表2. 示例 Math.Round() 为四舍六入五取偶 1.重载列表 API说明Round(Double)将小数值舍入到最近的整数值Round(Double, Int32)将小数值按指定的小数位数舍入Round(Double, Int32, MidpointRounding)将小数值按指定的小数位数舍入&#xff0c;MidpointRoundin…...

springboot手动触发参数校验,service层调用参数校验

背景 入参校验一般是在控制层通过javax.validation.constraints包下的规则注解如NotNull结合Valid与Validated实现&#xff0c;但是有时候我们的方法不提供给controller调用&#xff0c;这时候就无法触发自动参数校验&#xff0c;为此我们可以在不更改校验代码的前提下手动触发…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

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 编写的&#xff0c;需要先安…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...