当前位置: 首页 > article >正文

「C++系列」文件和流

【人工智能教程】,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。

点击跳转到网站:【人工智能教程】
在这里插入图片描述

文章目录

  • 一、文件和流
    • 1. 文件操作
      • ① 打开文件
      • ② 读写文件
    • 2. 流操作
  • 二、应用场景
    • 1. 日志记录
    • 2. 数据持久化
    • 3. 配置文件读写
  • 三、相关链接

一、文件和流

在C++中,文件和流是处理输入/输出(I/O)操作的两个核心概念。文件是存储在硬盘上的数据集合,而流则是一种抽象的数据源或数据目的地,用于数据的输入或输出。C++标准库提供了丰富的类和函数来支持文件和流的操作。

1. 文件操作

在C++中,文件操作通常通过<fstream>库中的类来实现,主要包括ifstream(用于从文件读取数据)、ofstream(用于向文件写入数据)和fstream(同时支持读写操作)。

数据类型描述
ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream该数据类型表示输入文件流,用于从文件读取信息。
fstream该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

① 打开文件

使用这些类之前,你需要使用它们的open成员函数来打开文件。如果文件成功打开,open函数会返回true

模式标志描述
ios::app追加模式。所有写入都追加到文件末尾。
ios::ate文件打开后定位到文件末尾。
ios::in打开文件用于读取。
ios::out打开文件用于写入。
ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
#include <fstream>
#include <iostream>

int main() {
    std::ifstream infile("example.txt");
    if (!infile.is_open()) {
        std::cerr << "Failed to open file" << std::endl;
        return 1;
    }
    // ... 读取文件内容
    infile.close();

    std::ofstream outfile("output.txt");
    if (!outfile.is_open()) {
        std::cerr << "Failed to open file" << std::endl;
        return 1;
    }
    // ... 写入文件内容
    outfile.close();

    return 0;
}

② 读写文件

对于ifstream,你可以使用>>运算符或getline()函数来读取数据。对于ofstream,你可以使用<<运算符来写入数据。

std::string line;
while (getline(infile, line)) {
    // 处理每一行
}

outfile << "Hello, World!" << std::endl;

2. 流操作

在C++中,流不仅限于文件操作。标准库还提供了其他类型的流,如cin(标准输入流)、cout(标准输出流)和cerr(标准错误输出流),它们分别用于从标准输入读取数据、向标准输出写入数据和向标准错误输出写入数据。

流操作非常灵活,支持多种数据类型和格式化输出。例如,你可以使用std::setwstd::setprecision等I/O操纵符来控制输出格式。

#include <iostream>
#include <iomanip> // 用于格式化输出

int main() {
    double pi = 3.141592653589793;
    std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 输出: 3.14
    return 0;
}

二、应用场景

C++中文件和流的应用场景非常广泛,包括但不限于日志记录、数据持久化、配置文件读写、用户输入/输出等。下面我将提供几个具体的应用场景及其案例代码。

1. 日志记录

日志记录是应用程序中非常重要的一部分,用于跟踪程序的运行情况、调试信息或用户行为等。

案例代码

#include <fstream>
#include <iostream>
#include <string>
#include <chrono>
#include <iomanip>

void logMessage(const std::string& message) {
    std::ofstream logFile("app.log", std::ios::app); // 使用append模式
    if (logFile.is_open()) {
        auto now = std::chrono::system_clock::now();
        auto in_time_t = std::chrono::system_clock::to_time_t(now);

        std::stringstream ss;
        ss << std::put_time(std::localtime(&in_time_t), "%Y-%m-%d %X") << ": " << message << std::endl;

        logFile << ss.str();
        logFile.close();
    }
}

int main() {
    logMessage("Application started.");
    // 模拟一些操作...
    logMessage("An error occurred.");
    return 0;
}

2. 数据持久化

数据持久化是指将程序中的数据保存到存储设备上,以便在程序终止后数据仍然可以恢复和使用。

案例代码

#include <fstream>
#include <iostream>
#include <vector>

void saveData(const std::string& filename, const std::vector<int>& data) {
    std::ofstream outfile(filename, std::ios::binary);
    if (outfile.is_open()) {
        for (int num : data) {
            outfile.write(reinterpret_cast<const char*>(&num), sizeof(num));
        }
        outfile.close();
    }
}

void loadData(const std::string& filename, std::vector<int>& data) {
    std::ifstream infile(filename, std::ios::binary);
    if (infile.is_open()) {
        int num;
        while (infile.read(reinterpret_cast<char*>(&num), sizeof(num))) {
            data.push_back(num);
        }
        infile.close();
    }
}

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5};
    saveData("data.bin", data);

    std::vector<int> loadedData;
    loadData("data.bin", loadedData);

    for (int num : loadedData) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 配置文件读写

配置文件是应用程序中用于存储配置信息的文件,如数据库连接信息、程序设置等。

案例代码(使用简单的文本格式):

#include <fstream>
#include <iostream>
#include <sstream>
#include <map>

std::map<std::string, std::string> readConfig(const std::string& filename) {
    std::map<std::string, std::string> config;
    std::ifstream infile(filename);
    std::string line;
    if (infile.is_open()) {
        while (getline(infile, line)) {
            size_t pos = line.find('=');
            if (pos != std::string::npos) {
                std::string key = line.substr(0, pos);
                std::string value = line.substr(pos + 1);
                config[key] = value;
            }
        }
        infile.close();
    }
    return config;
}

int main() {
    auto config = readConfig("config.txt");
    for (const auto& pair : config) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

在这里插入图片描述

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】
  11. 「C++系列」一篇文章讲透【运算符】
  12. 「C++系列」循环
  13. 「C++系列」判断
  14. 「C++系列」函数/内置函数
  15. 「C++系列」数字/随机数
  16. 「C++系列」数组
  17. 「C++系列」字符串
  18. 「C++系列」指针
  19. 「C++系列」引用
  20. 「C++系列」日期/时间
  21. 「C++系列」输入/输出
  22. 「C++系列」数据结构
  23. 「C++系列」vector 容器
  24. 「C++系列」类/对象
  25. 「C++系列」继承
  26. 「C++系列」重载运算符/重载函数
  27. 「C++系列」多态
  28. 「C++系列」数据抽象
  29. 「C++系列」数据封装
  30. 「C++系列」 接口(抽象类)

http://www.kler.cn/news/307355.html

相关文章:

  • 医学数据分析实训 项目四回归分析--预测帕金森病病情的严重程度
  • Java设计模式—面向对象设计原则(二) --------> 里氏代换原则 LSP (完整详解,附有代码+案列)
  • Linux 系统盘空间不足,想要将 Docker 镜像和容器数据迁移到数据盘
  • sqlgun靶场攻略
  • Mysql系列-索引简介
  • Vert.x HttpClient调用后端服务时使用Idle Timeout和KeepAlive Timeout的行为分析
  • 11.java面向对象
  • macOS上谷歌浏览器的十大隐藏功能
  • c语言中的常量定义(补充)
  • 【兼容性记录】video标签在 IOS 和 安卓中的问题
  • 队列-------
  • 英语学习交流平台|基于java的英语学习交流平台系统小程序(源码+数据库+文档)
  • EP12 分类列表元素点击跳转
  • 【云原生监控】Prometheus之PushGateway
  • 机器学习的入门指南
  • JVM HotSpot 虚拟机: 对象的创建, 内存布局和访问定位
  • Oracle数据库中的归档日志(Archive Log)详解与应用
  • 07_Python数据类型_集合
  • 系统 IO
  • 08_Python数据类型_字典
  • C# 记录一个获取系统空闲时间的函数,可用于判断休眠
  • 性能测试:Locust使用介绍(三)
  • MoCo对比损失
  • LC并联电路在正弦稳态下的传递函数推导(LC并联谐振选频电路)
  • 带你如何使用CICD持续集成与持续交付
  • 2024网络安全、应用软件系统开发决赛技术文件
  • Go语言现代web开发15 泛型和错误
  • C++中string字符串类型介绍及数组模拟
  • TDengine 与 SCADA 强强联合:提升工业数据管理的效率与精准
  • 如何在 Ubuntu 系统上部署 Laravel 项目 ?