温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++输入和输出流的示例分析

发布时间:2022-03-01 14:14:41 来源:亿速云 阅读:132 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关C++输入和输出流的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    输入和输出流

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

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

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

    C++输入和输出流的示例分析

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

    标准输入流

    常用的成员函数

    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.(原因:字符数组最后一个字符是不可见字符&rsquo;\0&rsquo;)

    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(&lsquo;h&rsquo;).cout.put(&lsquo;a&rsquo;);//打印结果就是: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>(文件流)

    感谢各位的阅读!关于“C++输入和输出流的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    c++
    AI