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

目录
  • 输入和输出流
    • 标准输入流
      • 小案例
    • 标准输出流
    • 文件读写
  • 总结

输入和输出流

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

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

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

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

标准输入流

常用的成员函数

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>(文件流)

总结

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

(0)

相关推荐

  • C++输入流和输出流 超级详细

    目录 1.简单介绍 2.C++输入流和输出流 1.简单介绍 C++ 又可以称为"带类的 C",即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象).在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf() .gets() 等函数从键盘读取数据,使用 printf() .puts() 等函数向屏幕上输出数据: 使用 fscanf() .fgets() 等函数读取文件中的数据,使用 fprintf() .fputs() 等

  • c++标准输入输出流关系的前世今生

    输入输出是每一种编程语言必不可少的部分,c++也不例外,下面我们就来说明c++的标准输入输出的前世今生. 1.首先说一下iostream和iostream.h的区别 #include<iostream> // 这个就是1998年标准化以后的标准头文件,使用时需要使用声明命名空间std #include<iostream.h> // 这个就是标准化以前的头文件,里面的函数以及类都是全局的 iostream是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h

  • C++学习之IO流(输入输出流)详解

    目录 介绍 基本输入.输出流 freopen 字符类的处理 介绍 流: 若干字节数据从一端到另一端我们叫做流 例如:操作文件,从程序到文件,数据的流动的操作称为流操作 流类体系 专门处理输入输出流.字符流.文件流,包含有: 流对象 流运算符 >>  << 输入/出流对象 + 流运算符 >>  <<---处理输入输出的数据 字符流对象 + 流运算符 >>   <<   ---处理字符流 文件的对象 + 流运算符 >>  &l

  • C++中输入输出流及文件流操作总结

    本文实例为大家分享了C++中输入输出流及文件流操作笔记,供大家参考,具体内容如下 1.流的控制 iomanip          在使用格式化I/O时应包含此头文件.     stdiostream   用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类继承关系 ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类 类ifstream继承了

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

    目录 输入和输出流 标准输入流 小案例 标准输出流 文件读写 总结 输入和输出流 从键盘输入数据,输出到显示器屏幕.这种输入输出称为标准的输入输出,简称标准I/O. 从磁盘文件输入数据,数据输出到磁盘文件简称文件I/O. 对内存中指定的空间进行输入输出,通常指定一个字符数组作为存储空间(存储任何信息),称为字符串输入输出,简称为串I/O 缓冲区:无论是输入还是输出都是存在缓存区的. 标准输入流 常用的成员函数 1,cin.get()获取一个字符 char c = cin.get(); 使用cin

  • Struts2数据输入验证教程详解

    一.前言 1.1.什么是输入验证?为什么需要输入验证? 在上一篇文章中,我们学习了数据类型转换,我们提到了表示层数据处理的两个方法,也提到了用户输入数据需要进行类型转换才能得到我们想要的数据,那么,我们怎么确定类型转换后的数据,是我们想要的数据呢?这里有点绕.你可以这样想:一个成年男子年龄是18岁,你现在想要得到18这个数据,但是,用户输入32,经过类型转换也是对的,但是数据不是你想要的.这时候,我们要怎么办?所以输入验证在这里就有用处了. 类型转换和输入验证的关系是:类型转换是输入验证的前提,

  • Struts中使用validate()输入校验方法详解

    1.在ActionSupport中有一个validate()方法,这个方法是验证方法,它会在execute()方法执行之前执行,所以能够起到很好的验证的作用. @Override //重写Action中的validate()方法 public void validate() { if(null==this.username||this.username.length()<4||this.username.length()>6){ this.addActionError("userna

  • 易语言的输入字类型详解

    在程序中书写输入字时,可以使用一个半角符号来引导该输入字,以指定其类型.各输入字的类型引导符号为: 首拼及全拼输入字: 分号(";") 如: ;qz(1.23) 或 ;quzheng(1.23) 双拼输入字: 冒号(":") 如: :quvg(1.23) 英文输入字: 单引号(" '") 如: 'int(1.23) 系统具有一个当前默认输入法状态,如果某输入字前没有加上类型引导符号,则默认是属于该输入法的输入字.系统安装完毕后,当前默认输入法为&

  • Go语言实现控制台输入&生成随机数详解

    1. 不同基础类型之间的转化 对于不同的基础类型之间的转化,Go 提供了 strconv包.它实现了字符串与其他基本数据类型之间的转化. 其中最常用的数值转化函数是Atoi和ltoa Atoi 方法可以将字符串类型的数值直接转化为int类型的数值,而 ltoa 可以将 int 类型的数值转化为string类型的值. 示例:控制台输入一个数值,进行数据大小的比较 package main import ( "fmt" "strconv" ) func main() {

  • php 输入输出流详解及示例代码

    最近在学习http协议!为了更好理解http协议,看了一下nodejs的http的模块!感觉收获还是挺多的.比如我用http的request发一个请求: var options = { host: 'localhost', port: 80, path: '/backbone/data.php', method: 'POST' }; var req = http.request(options, function(res) { console.log('STATUS: ' + res.statu

  • Java IO之字节输入输出流详解

    目录 1.字节输出流:OutputStream 2.字节输入流:InputStream 3.用字节流完成文件的复制 总结 那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream) 1.字节输出流:OutputStream public abstract class OutputStream extends Object implements Closeable,

  • Angular.js组件之input mask对input输入进行格式化详解

    前言 最近因为项目的需要,经常有一些对input输入进行格式化的需求,以前做的时候在js中写指令进行处理,但是这样又要在js或者在java代码中将请求的数据进行还原,很是麻烦,于是在网上看到了jquery的inputmask组件,觉得很好用,在项目中写出指令,用起来很方便. 方法如下: 在项目中引入jquery和jquery-inputmask,然后在项目中写指令,如下: define(['./module'], function (directives) { 'use strict'; dir

  • Android EditText实现输入金额类型详解

    前言 众所周知,Android中的editText默认的属性里面是没有金额类型的,所以要实现这个功能我们就必须自己动手丰衣足食.下面话不多说了,来一起看看详细的介绍吧. 一.EditText只允许输入数字.小数点. 首先要知道金额有两部分构成,整数部分和小数部分,要实现只输入数字和小数点很简单.自己查能很容易查到. 把type设置成InputType.TYPE_NUMBER_FLAG_DECIMAL|InputType.TYPE_CLASS_NUMBER 就行 那这样做有个缺点,小数部分可以有很

随机推荐