【C++】输入与输出
控制台输出ostream
cout输出流格式
基本输出

控制输出流,将十进制变成八进制
oct 是一个操纵符(manipulator),用于将整数以八进制(octal)格式输出到输出流。它通常与std::cout一起使用,用于改变后续输出整数的格式。

传递给cout参数后,后续都会变成八进制

变成十六进制

恢复成十进制

其他流操作符
| 操作符 | 功能 | 头文件 |
|---|---|---|
| std::dec | 将整数输出为十进制格式。 | iostream |
| std::oct | 将整数输出为八进制格式。 | iostream |
| std::hex | 将整数输出为十六进制格式。 | iostream |
| std::showbase | 在输出整数时显示进制前缀(如 0x 表示十六进制,0 表示八进制)。 | iostream |
| std::noshowbase | 禁止显示整数的前缀 | iostream |
| std::showpoint | 始终显示浮点数的小数点(即使小数部分为零) | |
| std::noshowpoint | 禁止始终显示小数点 | iostream |
| std::uppercase | 将十六进制字母输出为大写(如 A-F | iostream |
| std::nouppercase | 禁止将十六进制字母大写。 | iostream |
| std::showpos | 在正数前显示 + 符号。 | iostream |
| std::noshowpos | 禁止在正数前显示 + 符号。 | iostream |
| std::left | 左对齐输出。 | <iomanip |
| std::right | 右对齐输出(默认)。 | <iomanip |
| std::internal | 符号(如 + 或 -)左对齐,数字右对齐。 | iomanip |
| std::setw(n) | 设置输出宽度为 n 个字符(需要包含 <iomanip)。 | <iomanip |
| std::setfill(c) | 设置填充字符为 c(需要包含 <iomanip)。 | <iomanip |
| std::setprecision(n) | 设置浮点数的精度为 n 位(需要包含 <iomanip)。 | <iomani |
| std::fixed | 以固定小数点格式输出浮点数。 | <iomanip |
| std::scientific | 以科学计数法格式输出浮点数。 | <iomanip |
| std::boolalpha | 将布尔值输出为 true 或 false(而不是 1 或 0 | <iostream |
| std::noboolalpha | 禁止将布尔值输出为 true 或 false | <iostream |
| std::ws | 跳过输入流中的空白字符(如空格、制表符、换行符) | <iostream |
cout的函数
cout.put()输出单个字符

链式调用

与循环结合使用,用于逐个输出字符
while (*str):循环条件 *str 检查当前字符是否为 '\0',如果不是 '\0',则进入循环体。
std::cout.put(*str)输出当前指针指向的字符。str++将指针移动到下一个字符。

cout.write()
用于将指定数量的字符从字符数组写入输出流。

刷新缓冲区
cout.flush()
输出流(如 std::cout)通常使用缓冲区来存储待输出的数据,以提高效率。
刷新缓冲区意味着将缓冲区中的数据强制写入到目标设备

标准输出和错误输出重定向到文件
cerr<<
std::cerr 是 C++ 标准库中定义的一个输出流对象,属于标准错误流。它通常用于输出错误信息或诊断信息

再用cout输出一段文字

打开cmd,进入到返回的错误路径
D:\vs code\src\test_ostream\x64\Debug\test_ostream.exe

运行程序可以看到程序中的输出

用<将输出重定向到1.txt
此时只会输出cerr的内容

进入到文件路径

发现除cerr输出的内容,进入到了txt

输入指令将标准输出1重定向到1.txt,把错误输出2重定向到2.txt

文件展示如图

输入指令将标准输出1重定向到1.txt中,把错误输出2重定向到标准输出1中

文件展示如图

| 特性/功能 | std::cout | std::cerr | std::clog |
|---|---|---|---|
| 全称 | 标准输出流(Standard Output) | 标准错误流(Standard Error) | 标准日志流(Standard Log) |
| 默认设备 | 控制台标准输出 | 控制台标准错误 | 控制台标准错误(或日志文件) |
| 缓冲机制 | 行缓冲(或全缓冲,视实现) | 无缓冲(或行缓冲,视实现) | 全缓冲 |
| 使用场景 | 正常输出信息 | 错误信息、警告信息 | 日志记录、调试信息 |
| 立即输出 | 需要换行或缓冲区满 | 是(通常) | 否(需要刷新或缓冲区满) |
| 与 std::endl | 插入换行符并刷新缓冲区 | 插入换行符并刷新缓冲区 | 插入换行符但不刷新缓冲区 |
| 示例用法 | std::cout << "Hello"; | std::cerr << "Error!"; | std::clog << "Log message"; |
| 重定向 | 可通过 > 重定向 |
可通过 2> 重定向 |
可通过文件流重定向(如 ofstream) |
输入istream
单行输入getline
getline 用于处理字符串输入。它能够读取一行字符,直到遇到换行符(\n)或指定的终止符,并将读取的内容存储到字符串对象中。
cin.getline(buf, sizeof(buf) - 1)单行输入buf,大小不超过1024 -1 ,留的一位用来自动加入\0

还有一个用法std::getline(std::cin, line); ,读取后存入字符串line中

单个输入get
可以发现输入123后,c只获得了一个字符的输入

通过for循环将单个字符输入进cmd,如果按回车'\n'就打印出来

或者以分号结束

cin错误处理
如下代码,用来输入数字

当输入非数字时

会进入死循环,这是因为我们没有进行错误处理导致的

添加错误处理
cin.fail()当输入操作失败时,cin.fail() 会返回 true,否则返回 false。

经测试,还是会进入循环,这是因为没有清空cin的状态和缓冲区的错误数据导致

清空cin的状态和缓冲区的错误数据,不再无限循环
cin.clear()用于清除输入流的状态标志(即错误标志)。当输入操作失败时,输入流会进入“错误状态”(通常通过 cin.fail() 检测到)。在这种状态下,输入流会停止工作,直到错误标志被清除。
cin.ignore()用于丢弃输入缓冲区中的字符,直到满足指定的条件。
参数解释:
numeric_limits<streamsize>::max()是 C++ 标准库中定义的常量,表示streamsize类型的最大值(通常是一个很大的数字)。使用这个值可以确保丢弃缓冲区中剩余的所有字符。
'\n':表示忽略字符直到遇到换行符('\n')。换行符通常表示用户按下回车键,标志着输入的结束。

字符串拼接iostream
<sstream>头文件中的stringstream类
stringstream基础用法
stringstream 对象 ss 被用来将多个数据类型(字符串、整数和布尔值)依次写入到流中。流状态不会自动重置,因此所有数据会依次追加,而不是覆盖。最终打印的ss是全部的结果

同样支持cout的格式化

ss.str(" ")传入一个空串用来清空字符串

stringstream的格式化输入
stringstream 可以将字符串转换为各种数据类型(如 int、double 等),并将数据传入到变量中,要注意>>的方向

一次只传入一个数据,以空格为分隔

stringstream按行读取
eof()是std::istream类的一个成员函数,返回一个布尔值。
如果流已经到达文件末尾(EOF),则返回true;否则返回false。

fstream文件流的读写和打开模式
ifstream 支持读写文件
创建文件输出流对象的代码,使用了
fstream类来打开一个文件以进行二进制写操作。
wfs:是fstream对象的名字,用于后续对文件流的操作
ios::out:表示以输出模式打开文件,即向文件中写入数据
ios::binary:表示以二进制模式打开文件,而不是文本模式。在二进制模式下,数据会按原样写入文件,而不会进行任何格式化(如换行符转换等)。
ios::out | ios::binary:使用按位或运算符|组合了标志,表示同时以输出模式和二进制模式打开文件。

写入文件

默认在项目所在路径下

输出会默认清空文件的原内容

关闭文件流,以清空缓冲区
关闭文件流是一个良好的编程习惯,主要原因包括:
释放系统资源,避免资源泄漏。
确保数据写入,保证文件内容的完整性。
避免文件锁定,允许其他进程访问文件。
提高代码的可维护性和可读性。
避免潜在错误,如重复打开文件或资源耗尽。

ofstream 只支持写文件
std::ios::app:以追加模式打开文件,所有写入操作在文件末尾进行。不会清空原内容
std::ios::binary:以二进制模式打开文件。

追加写入

ifstream读文件
std::ios::in: 以输入模式打开文件,用于读取数据。
std::ios::binary: 以二进制模式打开文件,用于处理非文本数据。

使用
rfs.is_open()检查文件是否成功打开。如果成功打开就返回true
如果没有正确打开就返回false

定义一个
字符缓冲区 buf,然后使用 std::ifstream 的read 方法从文件中读取数据到这个缓冲区中。
rfs.read(buf, sizeof(buf) - 1);读取最多 1023 个字节到 buf 中,保留一个字节的位置添加终止符\0
rfs.gcount()方法输出实际读取的字节数

运行程序,成功输出了文件的字符数和文件内容

获取文件大小
ifstream ifs(file, ios::binary | ios::ate);
使用ifstream打开文件testfile.txt。
打开模式:
ios::binary:以二进制模式打开文件(避免对文件内容进行文本转换,比如处理换行符等)。
ios::ate:文件指针直接定位到文件末尾。
cout << file << "filesize = " << ifs.tellg() << endl;
使用ifs.tellg()获取当前文件指针的位置。指针在文件开头的位置是1
因为文件以ios::ate模式打开,文件指针直接位于文件末尾,因此ifs.tellg()返回的值就是文件的总大小(以字节为单位)。

不断读取文件更改后的内容
按行读取,使用 getline 从文件流 ifs 中读取一行到 line
检查 line 是否为空。如果不为空,则输出该行。
调用 ifs.clear(),清除文件流的错误状态标志,防止line空时程序停止,当文件添加数据后不再读取

运行程序,从文件中添加数据可以成功读取(记得先保存ctrl s才会读取)


浙公网安备 33010602011771号