C++:输入与输出

本文介绍了C++中的输入输出流类,包括`std::cin`, `std::cout`, `std::ifstream`, `std::ofstream`等,以及标准流对象如`std::cerr`。讨论了重定向、输入流结束判断及成员函数的使用,如`std::getline`和`std::peek`等。" 43376663,4906087,Mac环境搭建与管理svn服务器,"['svn管理', 'Mac环境', '代码仓库', '权限配置', '客户端操作']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入和输出

与输入输出流操作相关的类

  • istream是用于输入的流类,cin就是该类的对象。
  • ostream是用于输出的流类,cout就是该类的对象。
  • ifstream是用于从文件读取数据的类。
  • ofstream是用于向文件写入数据的类。
  • iostream是既能用于输入,又能用于输出的类。
  • fstream是既能从文件读取数据,又能向文件写入数据的类。

这些类的派生关系可以用下图来表达:

ios
istream
ostream
ifstream
iostream
ofstream
fstream

标准流对象

输入流对象:

  • cin与标准输入设备相连

输出流对象:

  • cout与标准输出设备相连
  • cerr与标准错误输出设备相连
  • clog与标准错误输出设备相连

Tipps: Why we need cerr?

通过重定向,使得coutcerr面向不同的地方输出数据,这就能达调试信息和程序真正应该输出的结果分开输出的目的。

cin对应于标准输入流,用于从键盘读取数据,也可以被重定向 为从文件中读取数据。

cout 对应于标准输出流,用于向屏幕输出数据,也可以被重定向为向文件写入数据。

cerr 对应于标准错误输出流,用于向屏幕输出出错信息

clog 对应于标准错误输出流,用于向屏幕输出出错信息

cerrclog的区别在于cerr不使用缓冲区,直接向显示器输出信 息;而输出到clog中的信息先会被存放在缓冲区,缓冲区满或者 刷新时才输出到屏幕。

重定向

输出重定向

#indlude<iostream>
using namespace std;
int main(){
	int x,y;
	cin>>x>>y;
	freopen("test.txt","w",stdout);
	//stdout默认为在屏幕上打印
	//将标准输出重定向到test.txt文件,w代表写
	if(y==0) //在屏幕上输出错误信息
		cerr<<"error."<<endl;
	else
		cout<<x/y;
	return 0;
}

输入重定向

freopen("in.txt", "r", stdin);
//cin被改为从in.txt文件里读取数据
//r代表read 读入

判断输入流结束

while (cin >> x)
{
	...
}
//第二种方法:
if (!cin.getline())
//注意:getline()读到留在流中的\n就会返回
  • 如果从文件输入,那么读到文件尾部就算结束;
  • 如果时键盘输入,则在单独一行输入ctrl+z代表输入结束
    cin 作为条件判断语句其实时做了一个强制类型转换!没有读到输入时返回false

istream类的成员函数

istream & getline(char * buf, int bufSize); 

从输入流中读取 bufSize-1 个字符到缓冲区 buf,或读到碰到 \n 为止(哪个先到算哪个)。

istream & getline(char * buf, int bufSize,char delim);

从输入流中读取 bufSize-1 个字符到缓冲区 buf,或读到碰到 delim 字符为止(哪个先到算哪个)。

两个函数都会自动在 buf 中读入数据的结尾添加 \0\ndelim 都不会被读入 buf,但会被从输入流中取走,即删掉。如果输入流中 \ndelim 之前的字符个数达到或超过了 bufSize 个,就导致读入出错,其结果就是:虽然本次读入已经完成,但会影响之后的操作,即是之后的读入就都会失败了。

  • bool eof():判断输入流是否结束
  • int peek():返回下一个字符,但不从流中去掉。使用场景:根据下一个字符的类型决定操作,同时不影响字符串的完整性。
  • istream& putback(char c);:将字符 ch 放回输入流
  • istream& ignore(int nCount = 1, int delim = EOF);:从流中删掉最多 nCount 个字符,遇到 EOF 时结束。

Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值