【C++】流(Stream)详解:标准流、文件流和字符串流

发布于:2025-05-14 ⋅ 阅读:(10) ⋅ 点赞:(0)

【C++】流(Stream)详解:标准流、文件流和字符串流

在C++编程中,流(Stream)是一个非常重要的概念,它为我们提供了统一的数据输入输出接口。本文将详细介绍C++中的三种主要流类型:标准流、文件流和字符串流。

一、标准流(Standard Streams)

标准流是C++预定义的流对象,用于基本的输入输出操作,主要包括:

1. cin (标准输入流)

#include <iostream>

int main() {
    int age;
    std::cout << "请输入您的年龄: ";
    std::cin >> age;  // 从标准输入读取数据
    std::cout << "您的年龄是: " << age << std::endl;
    return 0;
}

2. cout (标准输出流)

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;  // 输出到标准输出
    std::cout << "数字: " << 42 << std::endl;
    return 0;
}

3. cerr (标准错误流,无缓冲)

#include <iostream>

int main() {
    if (some_error_condition) {
        std::cerr << "发生了一个严重的错误!" << std::endl;  // 立即输出
    }
    return 0;
}

4. clog (标准错误流,有缓冲)

#include <iostream>

int main() {
    std::clog << "这是一条日志信息" << std::endl;  // 缓冲输出
    return 0;
}

特点比较:

  • cout用于常规输出
  • cerr用于错误信息,无缓冲,立即显示
  • clog用于日志信息,有缓冲

二、文件流(File Streams)

文件流用于文件的读写操作,需要包含<fstream>头文件。

1. ifstream (输入文件流)

#include <fstream>
#include <iostream>

int main() {
    std::ifstream inputFile("example.txt");  // 打开文件
    
    if (!inputFile) {
        std::cerr << "无法打开文件!" << std::endl;
        return 1;
    }
    
    std::string line;
    while (std::getline(inputFile, line)) {  // 逐行读取
        std::cout << line << std::endl;
    }
    
    inputFile.close();  // 关闭文件
    return 0;
}

2. ofstream (输出文件流)

#include <fstream>
#include <iostream>

int main() {
    std::ofstream outputFile("output.txt");  // 打开文件
    
    if (!outputFile) {
        std::cerr << "无法创建文件!" << std::endl;
        return 1;
    }
    
    outputFile << "这是第一行" << std::endl;  // 写入数据
    outputFile << "这是第二行" << std::endl;
    
    outputFile.close();  // 关闭文件
    return 0;
}

3. fstream (文件流,可读可写)

#include <fstream>
#include <iostream>

int main() {
    std::fstream file("data.txt", std::ios::in | std::ios::out | std::ios::app);
    
    if (!file) {
        std::cerr << "文件操作失败!" << std::endl;
        return 1;
    }
    
    file << "追加的内容" << std::endl;  // 写入
    
    file.seekg(0);  // 回到文件开头
    std::string content;
    while (std::getline(file, content)) {  // 读取
        std::cout << content << std::endl;
    }
    
    file.close();
    return 0;
}

文件打开模式:

  • ios::in - 读模式
  • ios::out - 写模式
  • ios::app - 追加模式
  • ios::trunc - 截断模式(如果文件存在则清空)
  • ios::binary - 二进制模式

三、字符串流(String Streams)

字符串流允许我们像操作流一样操作字符串,需要包含<sstream>头文件。

1. istringstream (输入字符串流)

#include <sstream>
#include <iostream>

int main() {
    std::string data = "John 25 3.8";
    std::istringstream iss(data);
    
    std::string name;
    int age;
    float gpa;
    
    iss >> name >> age >> gpa;  // 从字符串解析数据
    
    std::cout << "姓名: " << name << std::endl;
    std::cout << "年龄: " << age << std::endl;
    std::cout << "GPA: " << gpa << std::endl;
    
    return 0;
}

2. ostringstream (输出字符串流)

#include <sstream>
#include <iostream>

int main() {
    std::ostringstream oss;
    
    oss << "圆周率: " << 3.14159 << std::endl;
    oss << "2的平方: " << 2 * 2 << std::endl;
    
    std::string result = oss.str();  // 获取构建的字符串
    std::cout << result;
    
    return 0;
}

3. stringstream (字符串流,可读可写)

#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss;
    
    // 写入数据
    ss << "混合数据: ";
    ss << 42 << ' ' << 3.14;
    
    // 读取数据
    std::string prefix;
    int num;
    double pi;
    
    ss >> prefix >> num >> pi;
    
    std::cout << prefix << " " << num << " " << pi << std::endl;
    
    return 0;
}

常见用途:

  • 数据类型转换
  • 字符串拼接
  • 复杂字符串解析
  • 格式化输出到字符串

四、流的通用操作

所有流类型都支持一些通用操作:

  1. 状态检查

    if (myStream.good()) { /* 流状态正常 */ }
    if (myStream.eof()) { /* 到达文件末尾 */ }
    if (myStream.fail()) { /* 操作失败 */ }
    if (myStream.bad()) { /* 严重错误 */ }
    
  2. 清除状态标志

    myStream.clear();  // 清除所有错误状态
    
  3. 获取/设置位置

    std::streampos pos = myStream.tellg();  // 获取当前位置
    myStream.seekg(0, std::ios::beg);      // 回到开头
    

五、总结

C++的流库提供了强大而灵活的数据处理能力:

  1. 标准流:处理基本的控制台输入输出
  2. 文件流:读写文件数据
  3. 字符串流:在内存中处理字符串数据

理解这些流的概念和用法对于C++编程至关重要,它们不仅提供了统一的操作接口,还能帮助我们编写更清晰、更健壮的代码。


网站公告

今日签到

点亮在社区的每一天
去签到