7.IO类输入与输出

本文介绍了C++中的IO流类,包括iostream、fstream、istringstream和ostringstream,讲述了它们的不同类型、关系、状态管理、输出缓冲和文件模式,以及如何使用它们进行文件和内存操作,以及错误处理。

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

1. IO类

1.1 不同的IO类型

1. iostream
IO库定义了读写内置类型值的操作。
istream 类型,提供输入操作。例如 cin,从标准输入读取数据。
ostream 类型,提供输出操作。例如 cout,向标准输出写入数据。
2. fstream
fstream 类定义了读写命名文件的类型,其中:
ifstream 类型从文件读取数据;
ofstream 类型向文件写入数据。
3.sstream
sstream 类定义了读写内存对象的类型,其中:
istringstream 类型从string读取数据;
ostringstream类型向string写入数据。

1.2 IO对象无拷贝或赋值

我们不能拷贝或对 IO 对象赋值,如下所示:

ofstream out1, out2;
out1 = out2;                  // 错误,不能对流对象赋值
ofstream print(ofstram);      // 错误,不能初始化ofstream参数
out2 = print(out2);           // 错误,不能拷贝流对象

由于不能拷贝 IO 对象,因此也不能将形参或返回类型设置为流类型,进行 IO 操作的函数通常以引用方式传递和返回流。读写一个 IO 对象会改变其状态,因此传递和返回的引用不能是 const 的。

1.3 条件状态

IO 操作一个与生俱来的问题是可能发生错误。一些错误是可恢复的,而其他错误则发生在系统深处,已经超过了应用程序可以修正的范围。下面列出了 IO 类所定义的一些函数和标志,可以帮助我们访问和操纵流的状态条件。

函数含义
strm::iostatestrm 是一种 IO 类型,iostate 是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit指流已崩溃
strm::failbit指出一个 IO 操作失败了
strm::eofbit指出流到达了文件结束
strm::goodbit指流未处于错误状态。此值保证为 0
s.eof( )若流 s 的 eofbit 置位,则返回 true
s.fail( )若流 s 的 failbit 或 badbit 置位,则返回 true
s.bad( )若流 s 的 badbit 置位,则返回 true
s.good( )若流 s 处于有效状态,则返回 true
s.clear( )将流 s 中所有条件状态复位,将流的状态设置为有效,返回 void
s.clear(flags)根据给定的 flags 标志位,将流 s 中对应条件状态位复位。flags 的类型为 strm::iostate。返回 void
s.setstate(flags)根据给定的 flags 标志位,将流 s 中对应条件状态位置位。flags 的类型为 strm::iostate。返回 void
s.rdstate( )返回流 s 的当前条件状态,返回值类型为 strm::iostate

1.4 管理输出缓冲

每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。

os << "please enter a value";

导致缓冲刷新的原因很多,如下:
1.程序正常结束,作为 main 函数的 return 操作的一部分,缓冲刷新被执行。
2.使用操纵符如 endl 来显式刷新缓冲区。
1.刷新输出缓冲区
endl: 完成换行并刷新缓冲区的工作;
flush: 刷新缓冲区但不输出任何额外的字符;
ends: 向缓冲区插入一个空字符然后刷新缓冲区;
2.unitbuf操纵符
如果想在每次输出操作后都刷新缓冲区,我们可以使用unitbuf操纵符,它告诉流在接下来的每次写操作后都进行一次 flush 操作,而nounitbuf操作符则重置流,使其恢复使用正常的系统管理的缓冲区刷新机制。

cout << unitbuf;    // 任何输出都立即刷新
.....
cout << nounitbuf;  // 回到正常的缓冲方式

2. 文件输入输出

fstream 中定义的类型还增加一些新的成员来管理与流关联的文件。

函数含义
fstream fstrm创建一个未绑定的文件流
fstream fstrm(s)创建一个 fstream,并打开名为 s 的文件
fstream fstrm(s, mode)与前一个函数类似,但按指定类型 mode 打开文件
fstrm.open(s)打开名为 s 的文件,并将文件与 fstrm 绑定
fstream.close( )关闭与 fstrm 绑定的文件
fstrm.is_open( )返回一个bool 值,指出与 fstrm 关联的文件是否成功打开且尚未关闭

2.1 使用ifstream

当我们想要读写一个文件时,可以定义一个文件流对象,并将对象与文件关联起来。

#include <iostream>
#include <fstream>  // 需要包含这个头文件
#include <string>

int main() {
    std::ifstream infile("example.txt"); // 打开文件

    // 检查文件是否成功打开
    if (!infile) {
        std::cerr << "Unable to open file example.txt" << std::endl;
        return 1;
    }

    std::string line;
    // 逐行读取文件内容
    while (std::getline(infile, line)) {
        std::cout << line << std::endl; // 输出每一行内容
    }

    infile.close(); // 关闭文件
    return 0;
}

2.2 使用ofstream

该示例展示如何将一些文本写入文件中。

#include <iostream>
#include <fstream>  // 需要包含这个头文件

int main() {
    std::ofstream outfile("output.txt"); // 打开文件进行写入

    // 检查文件是否成功打开
    if (!outfile) {
        std::cerr << "Unable to open file output.txt" << std::endl;
        return 1;
    }

    // 向文件写入数据
    outfile << "Hello, World!" << std::endl;
    outfile << "Writing to a file is simple in C++." << std::endl;

    outfile.close(); // 关闭文件
    return 0;
}

注意: 在每次打开文件时,都要设置文件模式,可能是显式地设置,也可能是隐式的设置。

3. string流

sstream头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据。istringstream 从 string 读取数据,ostringstream 向 string 写入数据,stringstream既可以从 string 读数据也可向 string 写数据。

函数含义
sstream strmstrm 是一个未绑定的 stringstream 对象,sstream 是头文件 sstream 中定义的一个类型
sstream strm(s)strm 是一个 sstream 对象,保存 string s 的一个拷贝。此构造函数是 explicit 的
strm.str()返回 strm 所保存的 string 拷贝
strm.str(s)将 string s 拷贝到 strm 中

3.1 使用istringstream

istringstream 允许我们从字符串中读取数据,这对于解析字符串数据非常有用。

#include <iostream>
#include <sstream> // 引入istringstream所需头文件
#include <string>
int main() {
    std::string data = "42 3.14 Hello"; // 输入字符串
    std::istringstream iss(data); // 创建一个输入字符串流
    int intValue;
    double doubleValue;
    std::string stringValue;
    // 从字符串中读取数据
    iss >> intValue >> doubleValue >> stringValue;
    // 输出读取到的数据
    std::cout << "Integer: " << intValue << std::endl;
    std::cout << "Double: " << doubleValue << std::endl;
    std::cout << "String: " << stringValue << std::endl;
    return 0;
}

3.2 使用ostringstream

ostringstream 允许我们将数据以流的方式写入字符串,通常用于格式化输出。

#include <iostream>
#include <sstream> // 引入ostringstream所需头文件
#include <string>
int main() {
    std::ostringstream oss; // 创建一个输出字符串流
    int age = 25;
    double score = 92.5;
    std::string name = "Alice";
    // 将数据写入字符串
    oss << "Name: " << name << ", Age: " << age << ", Score: " << score;
    // 获取构建的字符串
    std::string result = oss.str();
    // 输出结果
    std::cout << result << std::endl;
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Litle_Pudding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值