C、C++读写操作

一、C读写

(EOF为C中宏常量,为-1)

1. 读

  • int scanf(“输入控制符1 输入控制符2 …”, 输入参数1, 输入参数2, …)

将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。函数返回值为int,表示成功读取的参数个数,但当输入ctrl+Z时,%d控制符会将其转换为0,%c将其转换为’\0’,但不算成功读取的个数;当有多个参数时,先输入ctrl+Z还会导致后面参数无法读取;ctrl+Z会让函数返回为EOF(-1),有多个参数时,中途输入ctrl+Z,前面的读取算成功个数;

当控制符为%d时,会忽略前面为空的字符(空格、回车、TAB),但不会忽略字母和一些控制字符,读到这些不匹配的数据就不会存入变量中了。

当输入ctrl+Z时,不管输入控制符是什么,缓冲区都会将ctrl+Z直到回车之间的字符都清除缓冲区(包括回车),若ctrl+Z是在中间输入,那么ctrl+Z之前的字符是有效的。

当控制符为%c时,不会忽略为空的字符(空格、回车、TAB),会将其读入变量;
当控制符为%s时,会忽略前面为空的字符(空格、回车、TAB),读到字符时,遇到为空的字符(空格、回车、TAB)就停止读取;

(在VS中不让使用scanf,而要用scanf_s代替)

//#include <stdio.h>
int a;
scanf("%d", &a);
scanf("a = %d", &a);//错,不让在输入控制符内写多余的东西
scanf("%c", &a);//错,控制符的格式要与变量的类型对应
char b;
scanf("%c", b);
char c[10];
scanf("%s", c);
char *d;
scanf("%s", d);//错,只能通过数组的方式输入字符串

//输入多个值
char a, b;
scanf("%c %c", &a, &b);//输入字符之间要有空格,因为格式控制符之间有空格

//scanf()的有趣用法

当输入控制符为[、[^时,可以只读取想要的字符

char a[10];
scanf("%['c']");//只有
  • scanf_s()

在Visual Studio中,为了更加安全的输入,使用scanf_s代替scanf进行读取操作,而且用法也有很大的变化,主要是在字符串、多个字符的读取方面,用法和C++中的cin.getline()相似,下面是在VS中的使用情况

int a,b;
scanf_s("%d %d", &a, &b);
char c, d;
scanf_s("%c %c", &c, 1, &d, 1);
char e[10];
scanf_s("%s", e, 10);//只能读取9个字符,并且最后1设置为‘\0’
  • void gets(数组名)
    gets用来读取字符串,会无线读取输入的字符串,遇到回车后,将结束读取将回车清出缓冲区,并添加’\0’到字符串末尾。无线读取字符是不安全的,它将未分配的空间也占用了,当数组大小为10,而我们输入的字符大于9就被占用未被分配的空间。
char a[10];
gets(a);
  • int getchar(void)
    getchar读取一个字符,返回一个该字符ASCI码值,不会将后面的任何字符(包括回车)请出缓冲区,也就是说当我们连续使用2个getchar时,我们向DOS输入1个字符回车后,第2个getchar实际读取的是回车。
    可以用来控制输入字符串的终止,当输入回车就停止读取。
    输入ctrl Z会返回EOF(-1)
char a;
//a = getchar();执行这个会发生隐式转换int->char
while(getchar() != '\n');
  • 没有getline()函数,在C++中有定义该函数在#include

2.写

  • printf(“输出控制符1, 输出控制符2, …”, 输出参数1, 输出参数2, …)
    当输出字符串变量时,可以省略输出控制符,其它类型不行。
char *a = "Hello";
char b[10] = "hello";
int c = 10;
//当输出字符串时,可以省略输出控制符,其它类型不行
//printf("%s", a);
//printf("%s", b);
printf(a);
printf(b);
printf("%d", c);//必须使用输出控制符
  • int puts( const char *str )
    只能输出字符串,并附加’\n’到输出中
//#include <stdio.h>
char *a = "Hello";
char b[10] = "hello";
puts(a);
puts(b);
  • int putchar( int ch )
    成功时返回写入的字符,失败则返回EOF,
char a = 'c';
int b = 65;
putchar(a);//会发生隐式转换char->int
putchar(b);

二、C++读写

1.读

1.1 cin >> 变量(可以是int、char、string、数组)

C中的scanf()需要控制符控制输入,C++能自己判断变量类型

char a;
int b;
string c;
char d[10];
int e[10];
cin >> a;
cin >> b;
cin >> c;
cin >> d;
cin >> e;     //错:不能向整型数组内直接存入
cin >> e[1];  //对

无效字符:空格、tab、回车
有效字符:键盘上可打印出来的字符,除去空格、tab、回车

  • 变量为int、char
    键盘输入时,变量会跳过缓冲区前面的无效字符,直到读入整数(或1个字符)就停止存入,后面的“空格、tab、回车”还存留在缓冲区内;
  • 变量为string、字符数组
    键盘输入时,变量会跳过缓冲区前面的无效字符,直到读入有效字符,遇到无效字符就停止存入,后面的“空格、tab、回车”还存留在缓冲区内;

1.2 int_type get();

当cin.get()无参数时,返回值为输入字符的ASCII对应的十进制,输入ctrl+Z,返回EOF(-1),char变量的-1为1111 1111(八进制为377)

int a = cin.get(); 
char b = cin.get(); //这里会发生隐式转换int->char
cin.get();

键盘输入时,cin.get()只会读取缓冲区内的1个字符,并返回该字符,因此常常用该函数控制键盘输入的结束,如下,当输入回车时结束读取存入:

char a ;
while ((a = cin.get()) != '\n');

1.3 basic_istream& get( char& ch )

char a ;
while (cin.get(a));
cin.clear();

键盘输入时,函数将从缓冲区读取1个字符存入字符变量中。在上面的循环中,当键盘输入ctrl+Z,函数读取就会出现错误,并且只有当在该行句首输入ctrl+Z,并回车,函数才会返回false,结束循环。而且此时cin已经处于不可使用的状态,因此需要使用cin.clear()函数进行重置才能正常使用cin。(只是在Window操作系统是这样,Linux解决方法不一样)
当然,也常用该函数控制键盘输入的结束,如下,当输入回车时结束读取存入:

char a ;
while(cin.get(a) && (a != '\n'));

1.4 basic_istream& cin.get(char *, 有符号整数count)

char a[10] ;
cin.get(a, 10);

从标注输入中读取字符串,直到’\n’为止,会读取空格,但不会读取’\n’,也不会将其清除缓冲。当count = 10时,则函数最多从缓冲区读取9个字符,最后一位默认补’\0’。

1.5 basic_istream& cin.getline(char *, 有符号整数count)

  • cin.getline(字符数组变量, 数组大小)
char a[10] ;
cin.getline(a, 10);
cin.clear();

不会读取存入回车,但会将回车从缓冲区清除
当count = 10时,则函数最多从缓冲区读取9个字符,最后一位默认补’\0’,
当键盘输入的字符大于9个时,数组就会导致cin状态发生改变,需要用cin.clear()进行重置;当键盘输入少于等于9个时,函数不会读取存入回车,只是会将回车从缓冲清除。

1.6 basic_istream& cin.getline(char *, 有符号整数count, char)

char a[10] ;
cin.getline(a, 10, 'c');

只会读取存入到字符常量’c’之前的字符,并且将字符常量’c’从缓冲区清除,字符常量’c’后的所有字符(包括回车)继续保留在缓冲区。

1.7 basic_istream& getline(istream, string)

定义于string头文件,属于非成员函数

//头文件#include <string>
string a ;
getline(cin, a);

读取键盘输入的字符存入a,不包括回车,最后补1个‘\0’,虽然不存入回车,但是会把回车从缓冲清理走。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值