【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才会读取)

posted @ 2025-04-21 14:57  plusu  阅读(272)  评论(0)    收藏  举报