【C++ primer】第十七章 输入、输出和文件

本文深入探讨了C++中输入输出的相关概念,包括流和缓冲区的作用、isostream类的管理细节、使用cout进行输出的方法及注意事项。通过实例演示了如何重载<<操作符、拼接输出、使用其他ostream方法、刷新输出缓冲区、进行格式化输出等技巧。

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

一,C++输入和输出的概述

1)流和缓冲区

流是程序和源流或流目标之间的桥梁

磁盘驱动器以512字节(或更多)的块为单位传输信息,程序通常每次只能处理一个字节信息。所以缓冲区用来匹配这两种不同的信息传输速率。

输出时,先填满缓冲区,然后把整块数据传输给硬盘,并清空缓冲区,以备下一批输出使用。

2)isotream类管理细节

cin 对象对应于标准输入流,关联到标准输入设备。wcin 对应 wchar_t

cout 标准输出流,wcout 对应 wchar_t

cerr 标准错误流,没有缓冲直接发送给屏幕,而不会等到缓冲区填满或新的换行符,wcerr对应 wchar_t

clog 标准错误流,有缓冲区,wclog对应 wchar_t

二,使用cout进行输出

1)重载<< 操作符 : ostream & operator<<(int);

C++指向字符串存储位置的指针来表示字符串

#include <iostream>
using namespace std;

int  main()
{
	char *pn="tianshuai";
	char name[10]="tianshuai";
	cout<<pn<<endl;
	cout<<name<<endl;
	cout<<"nihao"<<endl;
	return 0;
}

输出地址:cout<<&pn<<endl; cout<<(void *)pn<<endl; //不知道为什么输出不一样呢?

2)拼接输出: cout<<"tianshuai"<<V5<<endl; //cout<<"tianshuai" 返回cout对象

3)其他ostream方法:

cout.put('W'); //每次输出一个字符类型 字符

cout.put(65); //输出 a

char *pn = "tianshuai";

cout.write(pn,4); //输出 tian

4)刷新输出缓冲区

换行符 "\n" endl flush 刷新输出缓冲区。

5)用cout进行格式化

修改显示时使用的技术系统:

cout<<dec; //显示整数 采用 十进制 dec(cout);

cout<<hex; //显示整数 采用 十六进制

cout<<oct; //显示整数 采用 八进制

调整字段宽度:

cout.width(12); //只影响接下来显示的第一个项目,然后恢复默认。且放到12字符最右端(右对齐)

cout<<”#"; //输出为:" #";

注意:C++永远不会截断数据,假如在宽度为2的字段中打印一个7位值,C++将扩充字段

填充字符:

cout.fill("*"); //填充空白字符为 * 。影响整个程序输出

设置精度:

注意:C++默认精度为6位(末尾的0将不显示)

cout.precision(2); //精度设置为2 例如:2.153 输出为2.1

打印末尾的0和小数点:

cout.setf(ios_base::showpoint); //显示末尾0和小数点 ,不要忘记精度默认为6 例如:2.00 显示为2.00000

setf详解

注意:只有当基数为10时才使用加号。C++将十六进制和八进制都视为无符号的

cout.setf(ios_base::internal,ios_base::adjustfield); //符号或基数左对齐,值右对齐

cout.setf(ios_base::right,ios_base::adjustfield); //右对齐

iomanip头文件

cou<<setw(5)<<setfill('*')<<setprecision(3)<<endl; //设置宽度为5,填充为 * , 精度为4(小数点后4位)

### C++ Primer Plus 第17章 内容概述 #### 文件输入输出操作 C++文件处理主要依赖于`<fstream>`库中的三个类:`ifstream`, `ofstream` `fstream`。这些类分别用于读取文件、写入文件以及同时进行读写操作[^2]。 对于文件的状态管理,C++提供了多种方法来检测文件的操作情况。特别是当涉及到文件是否成功打开时,可以通过调用成员函数`is_open()`来进行判断。如果返回值为真,则表示该文件已被正确打开;反之则未成功打开。 #### 实际应用案例展示 下面是一个简单的程序实例,展示了如何利用命令行参数指定要创建并写入数据的目标文件: ```cpp #include <iostream> #include <fstream> using namespace std; int main(int argc, char* argv[]) { // 假设不会出现错误地尝试打开文件 ofstream out(argv[1]); cout << "请输入一串字符串:"; int ch; while ((ch = cin.get()) != EOF) out << static_cast<char>(ch); out.close(); return 0; } ``` 此代码片段实现了从标准输入接收字符直到遇到EOF(通常是Ctrl+D),并将接收到的数据逐字节复制到由命令行参数指定的文件中去[^4]。 #### 关联知识点补充说明 除了基本的文件I/O功能外,在实际开发过程中还经常需要用到动态内存分配技术。例如,在定义某些复杂结构体或对象时可能会涉及指针的应用场景。这里给出了一段关于名为`Cpmv`的自定义类型的描述,它内部维护着指向另一个结构体`Info`的对象指针,并重载了一些运算符以便更好地支持赋值语义加法组合逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值