C++学习第二十九课:C++ 输入输出流详解:从基础到高级应用

在 C++ 中,流(stream)是一种用于实现输入输出操作的抽象概念。流可以看作是字节的流动,这些字节可以从一个地方流向另一个地方,例如从键盘输入到程序中,或者从程序输出到屏幕。C++ 提供了一套完整的流库来处理各种类型的输入和输出,包括文件 I/O、字符串处理等。本文将详细介绍 C++ 中使用流进行输入和输出的方法,并结合实际案例进行讲解。

一、输入输出流的基本概念

在 C++ 中,流是通过流对象来操作的。流对象是 std 命名空间中的类模板实例化得到的对象,主要包括 istreamostreamiostream 三种类型。其中,istream 用于输入操作,ostream 用于输出操作,而 iostream 是前两者的组合。

1.1 标准输入输出流对象

C++ 预定义了四个标准流对象,分别是 cincoutcerrclog。它们分别对应于标准输入、标准输出、标准错误和标准日志。

示例代码:

cpp 复制代码
#include <iostream>

int main() {
    // 使用 cout 输出一段文本
    std::cout << "Hello, World!" << std::endl;

    // 使用 cin 读取一个整数
    int x;
    std::cin >> x;
    std:cout << "You entered: " << x << std::endl;

    return 0;
}

二、格式化输入输出

C++ 提供了一些操纵符(manipulator)来控制输出格式,例如设置填充字符、对齐方式、宽度等。

2.1 设置输出格式

示例代码:

cpp 复制代码
#include <iostream>
#include <iomanip>

int main() {
    int num = 12345;

    // 设置宽度为 10,向右对齐,不足位用 '0' 补齐
    std::cout << std::setw(10) << std::right << std::setfill('0') << num << std::endl;

    // 设置宽度为 10,向左对齐,不足位用空格补齐
    std::cout << std::setw(10) << std::left << num << std::endl;

    // 设置输出为十六进制形式
    std::cout << std::hex << num << std::endl;

    return 0;
}

三、文件输入输出

C++ 的 fstream 库提供了用于文件操作的类,包括 ifstream(用于读取文件)、ofstream(用于写入文件)和 fstream(同时支持读写)。

3.1 文件打开与关闭

示例代码:

cpp 复制代码
#include <fstream>
#include <iostream>

int main() {
    // 以读模式打开文件
    std::ifstream infile("example.txt");
    if (!infile) {
        std::cerr << "Error opening file for reading." << std::endl;
        return 1;
    }

    // 以写模式创建或覆盖文件
    std::ofstream outfile("output.txt");
    if (!outfile) {
        std::cerr << "Error opening file for writing." << std::endl;
        return 1;
    }

    // 关闭文件
    infile.close();
    outfile.close();

    return 0;
}

案例:读写CSV文件

CSV(逗号分隔值)文件是一种常见的数据存储格式。使用C++流可以方便地读写CSV文件。

cpp 复制代码
#include<fstream>
#include<sstream>
#include<vector>
#include<string>

std::vector<std::vector<std::string>> readCSV(const std::string& filename) {
    std::vector<std::vector<std::string>> data;
    std::ifstream infile(filename);
    std::string line;
    while (std::getline(infile, line)) {
        std::istringstream iss(line);
        std::vector<std::string> row;
        std::string value;
        while (std::getline(iss, value, ',')) {
            row.push_back(value);
        }
        data.push_back(row);
    }
    return data;
}

void writeCSV(const std::string& filename, const std::vector<std::vector<std::string>>& data) {
    std::ofstream outfile(filename);
    for (const auto& row : data) {
        for (size_t i = 0; i < row.size(); ++i) {
            outfile<< row[i];
            if (i < row.size() - 1) {
                outfile<< ",";
            }
        }
        outfile<< std::endl;
    }
}

int main() {
    std::vector<std::vector<std::string>> data = readCSV("input.csv");
    writeCSV("output.csv", data);
    return 0;
}

四、字符串流

C++ 的 sstream 库提供了用于字符串操作的类,包括 istringstream(用于从字符串读取数据)、ostringstream(用于向字符串写入数据)和 stringstream(同时支持读写)。

4.1 字符串读写操作

示例代码:

cpp 复制代码
#include <sstream>
#include <iostream>
#include <string>

int main() {
    // 创建一个字符串流对象
    std::istringstream iss("Hello, World!");

    // 从字符串流中读取数据
    std::string word;
    while (iss >> word) {
        std::cout << word << std::endl;
    }

    // 向字符串流中写入数据
    std::ostringstream oss;
    oss << "Number: " << 42;
    std::string result = oss.str();
    std::cout << result << std::endl;

    return 0;
}

五、总结

通过本文的介绍,我们了解了 C++ 中使用流进行输入和输出的基本概念和方法。流是 C++ 中处理输入输出的重要工具,它提供了一种灵活且高效的方式来处理不同类型的数据。在实际编程中,我们需要根据具体需求选择合适的流对象和操作方法,以便更好地完成输入输出任务。希望本文能够帮助大家更好地理解和掌握 C++ 中的流操作。

相关推荐
问道飞鱼3 分钟前
【前端知识】强大的js动画组件anime.js
开发语言·前端·javascript·anime.js
拓端研究室3 分钟前
R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别
android·开发语言·kotlin
Code成立5 分钟前
《Java核心技术I》Swing的网格包布局
java·开发语言·swing
Auc249 分钟前
使用scrapy框架爬取微博热搜榜
开发语言·python
QQ同步助手16 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
凯子坚持 c22 分钟前
仓颉编程语言深入教程:基础概念和数据类型
开发语言·华为
小爬虫程序猿24 分钟前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
程序猿-瑞瑞26 分钟前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm
qq_4335545427 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
易码智能35 分钟前
【EtherCATBasics】- KRTS C++示例精讲(2)
开发语言·c++·kithara·windows 实时套件·krts