最近在学习C和C++,除了在写OS的时候用到外,写算法的时候也会用到,整理记录C和C++读取数据的各种方式。

文章较长,总结稍微详细了一点。

c

输出

printf()

stdio.h 中包含最经典的输出函数 printf

#include <stdio.h>      // 执行 printf() 函数需要该库
int main()
{
printf("hello weiwei"); //显示引号中的内容
return 0;
}

格式化输出,在 printf中格式化输出的格式:

1)类型

格式字符 含义
d 以十进制形式输出带符号整数(正数不输出符号)
o 以八进制形式输出无符号整数(不输出前缀0)
x,X 以十六进制形式输出无符号整数(不输出前缀Ox)
u 以十进制形式输出无符号整数
f 以小数形式输出单、双精度实数
e,E 以指数形式输出单、双精度实数
g,G 以%f或%e中较短的输出宽度输出单、双精度实数
c 输出单个字符
s 输出字符串
p,P %p是一个新的格式控制符,它表示以十六进制的形式(带小写的前缀)输出数据的地址。如果写作%P,那么十六进制的前缀也将变成大写形式。

2)标志

标志 含义
- 结果左对齐
+ 输出符号(正负号)
空格 输出值为正时冠以空格,为负时冠以负号
# 对c、s、d、u类无影响;
对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。

3) 输出最小宽度

用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。

4) 精度

精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

5) 长度

长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。

我们通过一个实例来掌握用法:

#include<cstdio>
int main()
{
int a=15;
float b=123.1234567;
double c=12345678.1234567;
char d='p';
printf("a=%d\n", a);
printf("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a); // %% 可以输出 %
printf("b=%f\n", b);
printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);
printf("c=%f\n", c);
printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c);
printf("d=%c\n", d);
printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d);
printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c); // 输出地址 return 0;
}
  • 以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。
  • 以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
  • 输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。
  • 输出字符量d,其中“%8c ”指定输出宽度为8故在输出字符p之前补加7个空格

输入

scanf

scanf() 应该是我们所有人接触C语言的第一个输入函数了,输入同样需要指定输入的格式化类型和保存该变量的地址。

#include <cstdio>

int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d %d", &a, &b);
printf("a+b=%d\n", a+b);
scanf("%d, %d, %d", &a, &b, &c);
printf("a+b+c=%d\n", a+b+c); scanf("%d is bigger than %d", &a, &b);
printf("a-b=%d\n", a-b); char letter;
int age;
char url[30]; // 字符串的定义
float price; scanf("%c", &letter);
scanf("%d", &age);
scanf("%s", url); //可以加&也可以不加&
scanf("%f", &price); return 0;
}

scanf 函数是一种宽松的输入函数,你需要按照你指定的格式来输入,这个时候就可以按照你输入的格式来读取到响应的数据。

从本质上讲,我们从键盘输入的数据并没有直接交给 scanf(),而是放入了缓冲区中,直到我们按下回车键,scanf() 才到缓冲区中读取数据。如果缓冲区中的数据符合 scanf() 的要求,那么就读取结束;如果不符合要求,那么就继续等待用户输入,或者干脆读取失败。

格式控制符 说明
%c 读取一个单一的字符
%hd、%d、%ld 读取一个十进制整数,并分别赋值给 short、int、long 类型
%ho、%o、%lo 读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hx、%x、%lx 读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hu、%u、%lu 读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
%f、%lf 读取一个十进制形式的小数,并分别赋值给 float、double 类型
%e、%le 读取一个指数形式的小数,并分别赋值给 float、double 类型
%g、%lg 既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
%s 读取一个字符串(以空白符为结束)

getchar(), putchar()

int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

#include <stdio.h>

int main( )
{
int c; printf( "Enter a value :");
c = getchar( ); printf( "\nYou entered: ");
putchar( c );
printf( "\n");
return 0;
}

gets(), puts()

char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。

int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout

#include <stdio.h>

int main( )
{
char str[100]; printf( "Enter a value :");
gets( str ); printf( "\nYou entered: ");
puts( str );
return 0;
}

由于 gets 函数具有安全问题,现在已经不推荐使用。

c++

输入

cin()

使用cin输入时,程序将输入视为一系列字节。每个字节都被解释为字符编码。不管数据类型是什么,输入一开始都是字符数据,然后cin对象负责将数据转换成其他类型。

string name;
std::cin>>name;
std::cout<<name;

当你输入Michael Jackon时,通运行程序你会发现name只存储了Michael,这是为什么呢?

原来是 cin使用空白(空格,制表符和换行符)来确定字符串的结束位置。

在读取字符数组时,cin将只会读取第一个单词,cin将该字符串放到数组中,并自动添加空字符。Michael Jackon 之间的空格被当作结束符了,而Jackon被继续留在输入队列中,直到下一次读取输入。

getline()

getline() 函数用于读取整行,通过回车键来确定输入的结尾。

假如你还是要读取MIchael Jackon

String name;
getline(cin,name);
std::cout<<name:

或者你可以用char数组

char name[50];
std::cin.getline(name,50);
std::cout<<name;

这是你就会发现读取的是Michael Jackon了。

getline虽然通过读取换行符来读取结尾,但是它并不保存换行符,保存字符串是,他会用空字符来代替换行符。

getline读取完一行时,会从下一行开始读,也就是说我们可以跳过某一行。

假设我们读取文本文件时,不读取某一行,我们可以这样做:

string str;
getline(cin,str);

这样便跳过这一行了。

get()

iostream 中有一个名为get()的变体,他的工作方式和getline()类似。他们接受参数相同,解释参数的方式也相同,并且都读取到行尾。使用get()读取到行尾时不丢弃换行符,而是将它留在输入队列中:

cin.get(name,50);
cin.get(dessert,50);

假设读取了一个字符串,再读取时,读取到的便是换行符了,get()便认为已经到达行尾了,不再继续读取。

怎么解决呢?

我们可以在两次读取之间加一个cin.get();用来读取下一个字符,即使是换行符。

cin.get(name,50);
cin.get();
cin.get(dessert,50)

输出

cout

预定义的对象 coutiostream 类的一个实例。cout 对象"连接"到标准输出设备,通常是显示屏。cout 是与流插入运算符 << 结合使用的。我们使用 cout 来输出各种类型的数据,而不需要考虑输出数据的类型,使用 endl 来换行。

char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;

本文对C和C++中常用的输入输出命令做了简单总结,但是暂时还没有涉及到文件的输入输出,之后抽空总结一下C和C++中文件的输入输出。

欢迎访问我的博客github!

c和c++中读取数据的方式总结的更多相关文章

  1. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  2. 【Python】从文件中读取数据

    从文件中读取数据 1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件(文件PI_DESC.txt与file_reader.py在同一目录下) PI_DESC.txt 3.1415926535 ...

  3. TF从文件中读取数据

    从文件中读取数据 在TensorFlow中进行模型训练时,在官网给出的三种读取方式,中最好的文件读取方式就是将利用队列进行文件读取,而且步骤有两步: 把样本数据写入TFRecords二进制文件 从队列 ...

  4. 归纳从文件中读取数据的六种方法-JAVA IO基础总结第2篇

    在上一篇文章中,我为大家介绍了<5种创建文件并写入文件数据的方法>,本节我们为大家来介绍6种从文件中读取数据的方法. 另外为了方便大家理解,我为这一篇文章录制了对应的视频:总结java从文 ...

  5. spring boot: 从配置文件中读取数据的常用方法(spring boot 2.3.4)

    一,从配置文件中读取数据有哪些方法? 通常有3种用法: 1,直接使用value注解引用得到配置项的值 2,  封装到Component类中再调用 3,  用Environment类从代码中直接访问 生 ...

  6. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  7. 从多个XML文档中读取数据用于显示webapi帮助文档

    前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...

  8. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  9. 程序一 用记事本建立文件src.dat,其中存放若干字符。编写程序,从文件src.dat中读取数据,统计其中的大写字母、小写字母、数字、其它字符的个数,并将这些数据写入到文件test.dat中。

    用记事本建立文件src.dat,其中存放若干字符.编写程序,从文件src.dat中读取数据,统计其中的大写字母.小写字母.数字.其它字符的个数,并将这些数据写入到文件test.dat中. #inclu ...

随机推荐

  1. 「洛谷P1306」斐波那契公约数 解题报告

    P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很"简单"问题:第n项和第m项的最大公 ...

  2. 1081 检查密码 (15分)C语言

    本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输入格式: 输入第一行 ...

  3. 小小知识点(三十九) 正交频分复用OFDM的基本原理及实现

    引言 符号间干扰(ISI)是无线传输系统设计中需要考虑的因素,采用什么样的处理方法取决于数据传输速率或等效传输带宽来决定 (1)若数据速率低且与信道最大延迟相比符号持续时间较长,那么就可能无需任何均衡 ...

  4. linux下配置vnc-server 和gnome-session

    机器比较老,安装时间也十分久远,所以也不知道实验室系统当时是不是完全安装,最近需要使用vnc登录显示界面,结果问题就来了...没有安装vnc-server. (1)机器系统是rhel6.2的,所以就从 ...

  5. JWT实现授权认证

    目录 一. JWT是什么 二. JWT标准规范 三. 核心代码简析 四. 登录授权示例 五. JWT 使用方式 六. JWT注意事项 一. JWT是什么 JSON Web Token(JWT)是目前最 ...

  6. (数据科学学习手札72)用pdpipe搭建pandas数据分析流水线

    1 简介 在数据分析任务中,从原始数据读入,到最后分析结果出炉,中间绝大部分时间都是在对数据进行一步又一步的加工规整,以流水线(pipeline)的方式完成此过程更有利于梳理分析脉络,也更有利于查错改 ...

  7. 键盘优雅弹出与ios光标乱飘解决方案

    前言 在移动开发中,会遇到这样的情况,比如说有一个输入框在最底部的时候,我们弹起输入框,输入框不会在输入键盘上. 说明白简单点就是,输入框被键盘挡住了.而且在原生中,输入框应该正好在输入键盘上,但是h ...

  8. vue状态管理vuex从浅入深详细讲解

    1.vuex简介以及创建一个简单的仓库 vuex是专门为vue框架而设计出的一个公共数据管理框架,任何组件都可以通过状态管理仓库数据沟通,也可以统一从仓库获取数据,在比较大型的应用中,数据交互庞大的情 ...

  9. STM32串口遇到的一个问题

    做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题 1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8 ...

  10. C# 中 ConfigureAwait 相关答疑FAQ

    C# 中 ConfigureAwait 相关答疑FAQ 在前段时间经常看到园子里有一些文章讨论到 ConfigureAwait,刚好今天在微软官方博客看到了 Stephen Toub 前不久的一篇答疑 ...