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