C++ I/O

1 cin,>>

行动:从标准输入设备读取数据,忽略空格、标签、进入
>> :运营脱节

2 cin和 get,ignore,putback,peek

get(ch):将输入流中全部字符,包含空白符,读入到參数列表中指定变量相应的内存空间中
cin.ignore(intExp,chExp):忽略掉接下来的intExp个字符。或者首次遇到chExp曾经的全部字符
putback:将get函数在输入流中读取的最后一个字符回退到输入流中
peek:检查输入流。而且告诉程序输入流中下一个字符是什么,但并不实际读取这个字符。

演示样例代码:
#include <iostream>
using namespace std;

int main() {
	char ch;
	cout << "Enter a String :" << endl;
	// 输入:abcd

	cin.get(ch);// 取出输入流中第一字符 ch = a,  输入流中剩余:bcd
	cout << "ch = " << ch << endl;
	cin.get(ch);// 取出输入流中第一字符 ch = b,  输入流中剩余:cd
	cout << "ch = " << ch << endl;
	cin.putback(ch); // 将ch =b , 回退到输入流中,输入流中剩余:bcd
	cin.get(ch);// 取出输入流中第一字符 ch = b,  输入流中剩余:cd
	cout << "ch = " << ch << endl;
	ch = cin.peek(); // 尝试读取输入流中的第一字符。单并没有取走。输入流中剩余:cd
	cout << "ch = " << ch << endl;
	cin.get(ch);// 取出输入流中第一字符 ch = c,  输入流中剩余:d
	cout << "ch = " << ch << endl;

	return 0;
}
输出结果:
Enter a String :
abcd
ch = a
ch = b
ch = b
ch = c
ch = c

3 clear

当输入流遇到错误是,系统将忽略掉全部使用该输入流的I/O语句。能够使用Clear函数将输入流恢复到正常状态。
演示样例代码:
#include <iostream>
using namespace std;

int main() {
	int a = 23;
	int b = 34;
	cout << "Enter a number followed by a character:" << endl;
	cin >> a >> b;
	cout << "a="<< a << ",b=" << b << endl;
	cin.clear();// 将输入流变为正常状态。没有此句会直接结束
	cin.ignore(200,'
');
	cout << "Enter two numbers:" << endl;
	cin >> a >> b;
	cout << "a="<< a << ",b=" << b << endl;
	return 0;
}
执行结果:
Enter a number followed by a character:
232a
a=232,b=34
Enter two numbers:
23 21
a=23,b=21

4 setprecision,fixed,showpoint,setw

头文件:#include<iomanip>
setprecision:控制输出浮点数小数精度 ,
fixed:能够使输出的浮点数依照固定小数点个数输出。取消方法 cout.unsetf(ios::fixed)
showpoint:当计算机输出以固定小数点个数输出小数是。假设小数点后部分的值是0,那么默认输出的数字将没有小数点和小数点后面的数字。showpoint控制符能够强制显示输出小数点和小数点后面的0

演示样例代码:
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	double x, y, z;
	x = 15.572;
	y = 1234.43;
	z = 9823.2385;


	cout << fixed << showpoint;
	cout << setprecision(2) << "setprecision(2)" << endl;
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;
	cout << setprecision(3) << "setprecision(3)" << endl;
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;
	cout << setprecision(4) << "setprecision(4)" << endl;
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;

	cout << setprecision(3) << x << " " << setprecision(2) << y << " " << setprecision(4) << z << endl;


	return 0;
}

执行结果:
setprecision(2)
x = 15.57
y = 1234.43
z = 9823.24
setprecision(3)
x = 15.572
y = 1234.430
z = 9823.238
setprecision(4)
x = 15.5720
y = 1234.4300
z = 9823.2385
15.572 1234.43 9823.2385

能够用setf来指定fixed,scientific,showpoint。格式标志:ios::fixed,ios::scientific,ios::showpoint,。ios::fixed,ios::scientific 都是C++数据类型ios::floatfield的一部分。

当指定fixed或者scientific标志时,必须保证

ios::fixed 和ios::scientific 不能同一时候出现,并且必须保证ios::floatfield作为函数setf的第二个參数使用。

cout.setf(ios::fixed,ios::floatfield)
cout.setf(ios::showpoint)

另外还能够:

cout << setiosflags(ios::fixed);
cout << setiosflags(ios::showpoint)
或:cout << setiosflags(ios::fixed | ios::showpoint)

setw:指定输出表达式值占用的列数,默认是右对齐。
演示样例代码:
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	int x = 19;
	int a = 345;
	double y = 76.384;

	cout << fixed << showpoint;

	cout << "12345678901234567890" << endl;
	cout << setw(5) << x << endl;
	cout << setw(5) << a << setw(5) << "Hi" << setw(5) << x << endl << endl;

	cout << setprecision(2);
	cout << setw(6) << a << setw(6) << y << setw(6) << x << endl;
	cout << setw(6) << x << setw(6) << a << setw(6) << y << endl;

	cout << setw(5) << a << x << endl;
	cout << setw(2) << a << setw(4) << x << endl;


	return 0;
}
执行结果:
12345678901234567890
   19
  345   Hi   19


   345 76.38    19
    19   345 76.38
  34519
345  19

5 fill,setfill,left,right

fill,setfill 设置没有数据列,填充除空格符以为的其它字符
cout.fill('*');
cout << setfill('*');

演示样例代码:
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	int x = 19;
	int y = 7624;

	cout << "12345678901234567890" << endl;
	cout << setw(5) << x << setw(7) << y << setw(8) << "warm" << endl;
	cout.fill('*');
	cout << setw(5) << x << setw(7) << y << setw(8) << "warm" << endl;

	cout << setw(5) << x << setw(7) << setfill('#') << y << setw(8) << "warm" << endl;
	cout << setw(5) << setfill('@') << x << setw(7) << setfill('#') << y << setw(8) << setfill('^')<< "warm" << endl;
	cout.fill(' ');
	cout << setw(5) << x << setw(7) << y << setw(8) << "warm" << endl;

	
	return 0;
}
执行结果:
12345678901234567890
   19   7624    warm
***19***7624****warm
***19###7624####warm
@@@19###7624^^^^warm
   19   7624    warm

left,right 控制左对齐或者右对齐
cout << left
cout.unsetf(ios::left)

演示样例代码:
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	int x = 19;
	int y = 7624;

	cout << left;
	cout << "12345678901234567890" << endl;
	cout << setw(5) << x << setw(7) << y << setw(8) << "warm" << endl;
	cout.fill('*');
	cout << setw(5) << x << setw(7) << y << setw(8) << "warm" << endl;

	cout << setw(5) << x << setw(7) << setfill('#') << y << setw(8) << "warm" << endl;
	cout << setw(5) << setfill('@') << x << setw(7) << setfill('#') << y << setw(8) << setfill('^')<< "warm" << endl;
	
	cout.unsetf(ios::left);
	cout.fill(' ');
	cout << setw(5) << x << setw(7) << y << setw(8) << "warm" << endl;

	
	return 0;
}
执行结果:
12345678901234567890
19   7624   warm
19***7624***warm****
19***7624###warm####
19@@@7624###warm^^^^
   19   7624    warm

在标准C++ 中。left和right控制符仅仅能够作为格式标志使用。

因此,必须以setf和 setiosflags控制符来设置left和right

6 flush

清空缓冲区

7 string I/O

从标准设备中获取一行字符串:getline(cin,str)

8 file I/O

文件I/O 操作的5个步骤
1,#include<fstream>
2,定义文件流变量
3,将文件流与输入输出文件关联
4,读写文件
5。关闭文件

fileStreamVariable.open(sourceName,fileOpeningMode)

打开方式:
ios::in                                 以输入方式打开。ifstream类型默认打开方式
ios::out                               以输出方式打开。ofstream类型默认打开方式
ios::nocreate                     假设文件不存在,则打开操作失败
ios::app                              假设文件存在,则从文件的末尾開始写入数据。假设不存在创建一个新文件 
ios::ate                               以输出方式打开文件将文件读写位置移到文件末尾。输出数据能够写到文件的不论什么地方
ios::trunc                            假设文件存在,当中的内容将被删除(截掉)
ios::noreplace                   假设文件存在。则打开操作失败

#include<fstream>
#include<stream>
using namespace std;
int main()
{
	fstream fin("data.txt");  //打开文件
	string ReadLine;
	while(getline(fin,ReadLine))  //逐行读取,直到结束
	{
		...
	} 
	fin.close();
	return 0
}

#include <iostream>
#include <iomanip>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
	int test1,test2,test3,test4,test5;
	char id;
	double avg;

	ifstream ifs("test.txt");

	if (!ifs)
	{
		cout << "Cannot open input file." << endl;
		return 1;
	}

	ofstream ofs("result.txt");
	ifs >> id >> test1 >> test2 >> test3 >> test4 >> test5;

	avg = (test1 + test2 + test3 + test4 + test5) / 5.0;
	ofs << fixed << showpoint << setprecision(2);
	ofs << setw(25) << right << "Student Id:" << setw(8) << id << endl;
	ofs << setw(25) << right << "Test Score:" << setw(8) << test1 << setw(8) << test2 << setw(8) << test3 << setw(8) << test4 << setw(8) << test5 << endl;
	ofs << setw(25) << right << "Average test score:" << setw(8) << avg << endl;

	ifs.close();
	ofs.close();
}


总结:

  1. C++ 中的流是从源到目标的一系列字符的有限序列
  2. 输入流是从源到计算机的流
  3. 输出流是从计算机到目标的流
  4. cin代表标准输入。是输入流对象,通常初始化为标准输入设备——键盘
  5. cout代表标准输出,是输出流对象,通常初始化为标准输出设备——屏幕
  6. 双目运算符>>和输入流对象,如cin,结合使用时被称为流析取运算符。 >> 左边的对象必须是输入流对象。如cin,右边的操作数必须是变量
  7. 双目运算符<<和输出流对象。如cout,结合使用时被称为流插入运算符。 << 左边的对象必须是输出流对象。如cout。右边的操作数必须是变量
  8. 当使用运算符>> 将数据读入变时。将忽略掉数据前的全部空白符
  9. 为了使用cin和cout,程序必须包括iostream文件
  10. get 函数用于逐个读入字符,不会忽略到不论什么空白符
  11. ignore函数用于在一行中略掉某些数据
  12. putback函数用于将get函数读入的最后一个字符退回到输入流中
  13. peek函数返回输入流中的当前字符。可是并不将该字符重输入流中移走
  14. 试图将非法数据读入变量将导致输入流进入错误状态
  15. 一旦输入流进入错误状态,能够使用clear函数将输入流恢复成正常状态
  16. setprecision控制符用来设置输出浮点数的精度
  17. fixed控制符将浮点数以固定小数点个数输出
  18. showpoint控制符用来指定浮点数必须包括小数点和小数点末尾的零
  19. setw控制数据列宽,默认右对齐
  20. 假设在setw 中指定的输出列宽小于实际数据须要,数据不会被截短,而是依照实际宽度输出
  21. get,ignore,put,peek,fill,clear,setf,unsetf流函数头文件在 iostream中
  22. setprecision,setw,setfill,setiosflags在iomanip中
  23. 头文件fstream包括ifstream和ofstream定义
  24. 打开需要关闭该文件

版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/hrhguanli/p/4654747.html