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++ 中文件操作的基本方法,根据具体需求选择合适的方式。

相关推荐
fqbqrr17 小时前
2606C++,C++构的多态
开发语言·c++
小欣加油17 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
Yolo_TvT18 小时前
C++:析构函数
c++
Hello:CodeWorld20 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
搬砖魁首1 天前
基础能力系列 - 多线程2 - 条件变量
c++·rust·条件变量·原子类型·线程同步互斥
chase_my_dream1 天前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
牛油果子哥q1 天前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
凡人叶枫1 天前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
不想写代码的星星1 天前
std::move 根本不移动,就像老婆饼里没有老婆
c++
redaijufeng1 天前
C++雾中风景7:闭包
c++·算法·风景