c++怎么读取文件里的内容和往文件里写入数据

在 C++ 中,读取和写入文件主要通过 <fstream> 头文件提供的类来实现。以下是详细的方法和示例:

1. 包含必要的头文件

cpp 复制代码
#include <fstream>  // 文件流操作
#include <string>   // 使用字符串
#include <iostream> // 输入输出

2. 写入文件

使用 ofstream (输出文件流)

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

int main() {
    // 创建输出文件流对象
    std::ofstream outFile;
    
    // 打开文件(如果文件不存在会自动创建)
    outFile.open("example.txt");
    
    // 检查文件是否成功打开
    if (!outFile.is_open()) {
        std::cout << "无法打开文件!" << std::endl;
        return 1;
    }
    
    // 写入数据
    outFile << "Hello, World!" << std::endl;
    outFile << "这是第二行" << std::endl;
    outFile << 123 << " " << 45.67 << std::endl;
    
    // 关闭文件
    outFile.close();
    
    std::cout << "数据写入成功!" << std::endl;
    return 0;
}

简化的写入方式

cpp 复制代码
#include <fstream>

int main() {
    // 使用构造函数直接打开文件
    std::ofstream outFile("example.txt");
    
    if (outFile) {  // 检查文件是否成功打开
        outFile << "简化方式写入数据" << std::endl;
        outFile << "自动会在析构时关闭文件" << std::endl;
    }
    
    return 0;
}

3. 读取文件

使用 ifstream (输入文件流)

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

int main() {
    // 创建输入文件流对象
    std::ifstream inFile;
    inFile.open("example.txt");
    
    if (!inFile.is_open()) {
        std::cout << "无法打开文件!" << std::endl;
        return 1;
    }
    
    std::string line;
    
    // 逐行读取文件内容
    while (std::getline(inFile, line)) {
        std::cout << line << std::endl;
    }
    
    inFile.close();
    return 0;
}

其他读取方式

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

int main() {
    std::ifstream inFile("example.txt");
    
    if (inFile) {
        // 方式1:逐词读取
        std::string word;
        while (inFile >> word) {
            std::cout << "单词: " << word << std::endl;
        }
        
        // 清空文件状态并重新定位到开头
        inFile.clear();
        inFile.seekg(0);
        
        // 方式2:读取单个字符
        char ch;
        while (inFile.get(ch)) {
            std::cout << ch;
        }
    }
    
    return 0;
}

4. 同时读写文件

使用 fstream

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

int main() {
    // 打开文件用于读写
    std::fstream file("data.txt", std::ios::in | std::ios::out | std::ios::app);
    
    if (file.is_open()) {
        // 写入数据
        file << "新数据" << std::endl;
        
        // 移动到文件开头
        file.seekg(0);
        
        // 读取数据
        std::string content;
        while (std::getline(file, content)) {
            std::cout << content << std::endl;
        }
        
        file.close();
    }
    
    return 0;
}

5. 二进制文件操作

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

struct Data {
    int id;
    double value;
    char name[20];
};

int main() {
    // 写入二进制数据
    Data data = {1, 3.14, "Test"};
    
    std::ofstream outFile("binary.dat", std::ios::binary);
    if (outFile) {
        outFile.write(reinterpret_cast<char*>(&data), sizeof(Data));
        outFile.close();
    }
    
    // 读取二进制数据
    Data readData;
    std::ifstream inFile("binary.dat", std::ios::binary);
    if (inFile) {
        inFile.read(reinterpret_cast<char*>(&readData), sizeof(Data));
        std::cout << "ID: " << readData.id 
                  << ", Value: " << readData.value 
                  << ", Name: " << readData.name << std::endl;
        inFile.close();
    }
    
    return 0;
}

6. 文件打开模式

模式标志 描述
std::ios::in 打开用于读取
std::ios::out 打开用于写入
std::ios::app 追加模式(在文件末尾写入)
std::ios::ate 打开后定位到文件末尾
std::ios::trunc 如果文件存在,先截断
std::ios::binary 二进制模式

重要提示

  1. 总是检查文件是否成功打开
  2. 记得关闭文件(虽然析构函数会自动关闭,但显式关闭是好习惯)
  3. 处理可能的异常(文件不存在、权限问题等)
  4. 使用合适的打开模式
  5. 二进制文件操作时要注意数据对齐和字节顺序

这些是 C++ 中文件操作的基本方法,根据具体需求选择合适的方式。

相关推荐
ceclar12320 小时前
C++Lambda表达式
开发语言·c++·算法
bkspiderx20 小时前
Linux网络与路由配置完全指南
linux·运维·网络·c++
慧都小妮子20 小时前
基于C++ UA Server SDK开发高性能与跨平台 OPC UA 服务器
c++·跨平台·高性能·opc ua·ua server sdk
INGNIGHT21 小时前
单词搜索 II · Word Search II
数据结构·c++·算法
楼田莉子21 小时前
C++学习:C++11关于类型的处理
开发语言·c++·后端·学习
彷徨而立1 天前
【C/C++】只知道窗口句柄,如何擦除窗口内容,清理窗口?
c语言·c++·windows
強云1 天前
匿名命名空间 - c++
c++
云知谷1 天前
【经典书籍】C++ Primer 第14类虚函数与多态精华讲解
c语言·开发语言·c++·软件工程·团队开发
HVACoder1 天前
复习下线性代数,使用向量平移拼接两段线
c++·线性代数·算法
电子云与长程纠缠1 天前
UE5 C++ CVar控制台命令字段使用
c++·学习·ue5