C++的输入和输出流详解

 更新时间:2022年3月1日 13:10  点击:230 作者:是小明同学啊

输入和输出流

从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。

从磁盘文件输入数据,数据输出到磁盘文件简称文件I/O。

对内存中指定的空间进行输入输出,通常指定一个字符数组作为存储空间(存储任何信息),称为字符串输入输出,简称为串I/O

img

缓冲区:无论是输入还是输出都是存在缓存区的。

标准输入流

常用的成员函数

1,cin.get()获取一个字符

char c = cin.get();

使用cin.get()可以家当缓冲区中的换行符拿走。注意返回值是什么类型的,拿走的数据再输出的时候就是什么类型。

2,cin.get(两个参数)获取字符串

参数是字符串数组名和个数

使用cin.get(两个参数)那字符串的时候,换行符\0会遗留在缓冲区中。

char buf[100] = {0};
cin.get(buf, 100);
cout << buf<< endl;

只满足字符数组,且输出的字符个数总比第二个参数少1.(原因:字符数组最后一个字符是不可见字符’\0’)

3,cin.getline()获取字符串

接收一个字符串并输出

和cin.get(两个参数)相似,不会将换行符加入字符串,但是也不会留在缓冲区中,而是直接扔掉。

char buf[100] = {0};
cin.getline(buf, 100);
cout << buf << endl;

可以有第三个参数,就是终止位置(一个字符,不包括这个字符)

4,cin.ignore()忽略一个字符

括号中可以填入参数,参数就是忽略字符的个数。默认是一个。

cin.ignore();
char c = cin.get();//ab
cout << c << endl;//b,将a忽略了

5,cin.peak()偷窥

char c = cin.peek();
cout << c << endl;//a
char m = cin.get();
cout << m << endl;//a

缓冲区中,输入了一个a,然后cin.peek()只是看了一眼,并没有拿走,所以调用cin.get()的时候可以直接从缓冲区中拿。

6,cin.putback()放回(原来的位置)

char c = cin.get();
cin.putback(c);//将从缓冲区拿走的字符返回原位置
char buf[100] = { 0 };
cin.getline(buf, 100);//接收的是缓冲区中的字符串,输出的对象是buf这个字符数组。 
cout << buf << endl;

输入hello,输出仍是hello。

小案例

案例一:判断输入的内容是字符串还是数字(不存在混合的情况)

int main()
{
	cout << "请输入一个数字或者一个字符串" << endl;
	char c = cin.peek();
	if (c >= '0' && c <= '9')
	{
		cout << "数字" << endl;
		int num;
		cin >> num;
		cout << num << endl;
	}
	else
	{
		cout << "字符串" << endl;
		char buf[100] = { 0 };
		cin >> buf;
		cout << buf << endl;
	}
	return 0;
}

案例二:

用户输入0-10之间的数字,如果输入有误,重新输入。

int main()
{
	cout << "请输入一个0-10之间的数字" << endl;

	while(true)
	{
		int num;
		cin >> num;
		if (num >= 0 && num <= 10)
		{
			cout << "输入正确,输入的值为: " << num << endl;
			break;
		}
		else
		{
			cout << "输入有误,请重新输入" << endl;
		}
	}
	return 0;
}

如果输入的是一个数字,那么一切正常。但是如果输入字符,那么就是陷入死循环。这个时候就是缓存区出现了问题。

所以,如果没有输入正确,那么可以进行清空缓存区和重置标志位。(这个标志位如果是0表示缓冲区正常,1就是不正常)

cin.clear();//清空缓冲区
cin.sync();//重置标志位
cin.ignore();//帮助清空2013版本以上需要加。
//上面三句话连着使用。
cin.fail();//标志位

标准输出流

1,cout.put(),向缓冲区写一个字符

括号里面是啥,就打印啥。

可以拼接使用:cout.put(‘h’).cout.put(‘a’);//打印结果就是:ha

2,cout.write(两个参数),

两个参数是char* ,和 对应字符串的长度(不能超过最大长度)。从字符串中拿走规定长度的内容输出。

char arr[] = "hello";
cout.write(arr, strlen(arr));//hello

但是如果要全部打印的话,直接使用cout<<arr<<endl;也是可以的。优点应该是可以打印规定长度的字符串。

格式化输出:

(1) 通过流成员函数 格式化输出

int main()
{
	int num = 99;
	cout.width(5);//指定宽度为20(向前面加空格),结果:   99
	cout.fill('*');//空格处都填充上*,结果:***99,(填充内容会被下一此的填充内容覆盖)
	cout.setf(ios::left);//输出的文本左对齐,结果99***
    cout.unsetf(ios::dec);//卸载十进制
	cout.setf(ios::hex);//安装十六进制,结果为63***
	cout.setf(ios::showbase);//显示基数,结果0x63*。输出对应进制的基数,16进制就是0x
	cout.unsetf(ios::hex);//卸载十六进制
	cout.setf(ios::oct);//安装八进制,结果为0143*。
	cout << num << endl;
	return 0;
}	

(2) 使用控制符 格式化输出

如果使用控制符格式化输出的话,需要引用头文件

#include<iomanip>

指定宽度:

    int number = 110;
	cout << setw(20)//指定宽度为20,然后默认将数据右对齐
		<< number
		<< endl;
	//运行结果:                 110

填充:

    int number = 110;
	cout << setw(20)
		<< setfill('*')//填充,位置在前在后无所谓
		<< number
		<< endl;
	//运行结果:*****************110

显示基数:

int number = 110;
	cout << setw(20)
		<< number
		<< setfill('*')
		<< setiosflags(ios::showbase)//显示基数
		<< endl;	
	//运行结果:*****************110,和上面的没有区别,因为十进制是没有基数的。

设置左对齐:

	int number = 110;
	cout << setw(20)
		<< setfill('*')
		<< setiosflags(ios::showbase)
		<< setiosflags(ios::left)//设置左对齐
		<< number
		<< endl;	
	//运行结果:110*****************
//这个时候需要注意一下,如果按照刚才将number写在前面的时候是得不到想要的结果的,所以应该将最终要输出的内容尽量写在右边。

显示十六进制:

	int number = 110;
	cout << setw(20)
		<< setfill('*')
		<< setiosflags(ios::showbase)
		<< setiosflags(ios::left)
		<< hex//显示16进制
		<< number
		<< endl;	
	//运行结果:0x6e****************

文件读写

写文件:

需要引头文件:#include<fstream>(文件流)

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容! 

原文出处:https://blog.csdn.net/qq_51399192/article/details/123170704

[!--infotagslink--]

相关文章

  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • vue:el-input输入时限制输入的类型操作

    这篇文章主要介绍了vue:el-input输入时限制输入的类型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-05
  • C++ pair的用法实例详解

    这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C++中的循环引用

    虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++如何删除map容器中指定值的元素详解

    map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
  • C++ 约瑟夫环问题案例详解

    这篇文章主要介绍了C++ 约瑟夫环问题案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-15
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 基于C++中常见编译错误的总结详解

    本篇文章是对C++中的常见编译错误进行了详细的分析介绍,需要的朋友参考下...2020-04-25