C++ 文件操作-写入文本文件/读取文本文件

C++ 中文件操作的基础包括文件的读写,文件流的使用,以及如何处理文件操作中可能遇到的问题。我们可以通过 fstreamifstreamofstream 这些标准库类来实现文件的操作。

1. 文件操作的基础知识

文件流类型
  • ofstream (output file stream): 用于向文件写入数据。
  • ifstream (input file stream): 用于从文件读取数据。
  • fstream (file stream): 同时支持读和写操作。
常用文件模式
  • ios::in: 打开文件用于读取(默认模式为 ifstream)。
  • ios::out: 打开文件用于写入(默认模式为 ofstream)。
  • ios::app: 以追加模式写入文件,保留文件原内容。
  • ios::trunc: 清空文件内容(默认写入模式,如果文件已存在,会清空原有内容)。
  • ios::binary: 以二进制模式打开文件(默认是文本模式)。

2. 写入文本文件

我们首先使用 ofstream 类来向文件中写入文本。

示例代码:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 打开文件,注意ios::out是写入模式
    std::ofstream outfile("example.txt", std::ios::out);

    // 检查文件是否成功打开
    if (!outfile) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    // 向文件中写入文本
    outfile << "这是一行文本。" << std::endl;
    outfile << "这是第二行文本。" << std::endl;

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

    std::cout << "写入文件成功!" << std::endl;

    return 0;
}

注意事项:
  • 每次使用 ofstream 打开文件时,如果没有指定 ios::app,文件内容会被清空。
  • 在写入文件后,务必记得使用 close() 关闭文件,否则可能会导致数据未能正确写入。

3. 读取文本文件

我们使用 ifstream 类来从文件中读取数据。

示例代码:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 打开文件,注意ios::in是读取模式
    std::ifstream infile("example.txt", std::ios::in);

    // 检查文件是否成功打开
    if (!infile) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    std::string line;

    // 使用getline读取文件每一行
    while (std::getline(infile, line)) {
        std::cout << line << std::endl;
    }

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

    return 0;
}

注意事项:
  • 使用 std::getline() 逐行读取文件。
  • 检查文件是否成功打开是很重要的,避免操作不存在的文件或路径错误。

4. 文件的随机读写

如果需要在文件的任意位置进行读写,可以使用 seekg()seekp() 来调整文件指针的位置:

  • seekg(pos):设置文件的读取位置。
  • seekp(pos):设置文件的写入位置。
示例代码:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 以读写模式打开文件
    std::fstream file("example.txt", std::ios::in | std::ios::out);

    if (!file) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    // 移动写入位置到文件开始的第10个字符
    file.seekp(10);
    file << "插入内容";

    // 移动读取位置到文件开始
    file.seekg(0);
    std::string line;
    while (std::getline(file, line)) {
        std::cout << line << std::endl;
    }

    file.close();
    return 0;
}

5. 常见坑和注意事项

  1. 忘记检查文件是否成功打开: 文件操作前一定要检查文件是否成功打开,否则可能会出现未预料的行为。

  2. 文件路径问题: 文件路径应当正确,最好使用绝对路径或者检查当前的工作目录。

  3. 文件权限问题: 确保具有对文件的读写权限,尤其是在多用户环境下。

  4. 二进制与文本模式的区别: 如果是处理非文本文件(如图像、音频等),应使用二进制模式打开文件 (ios::binary),否则可能出现数据损坏。

  5. 文件操作失败后不处理: 如果文件操作失败(例如磁盘已满),未能及时检测并处理错误,可能会导致数据丢失。

6. 完整的示例

以下是一个将文本写入文件并读取文件的完整示例:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 写入文件
    std::ofstream outfile("example.txt", std::ios::out);
    if (!outfile) {
        std::cerr << "无法打开文件进行写入" << std::endl;
        return 1;
    }
    outfile << "C++ 文件操作示例" << std::endl;
    outfile << "这是文件操作的测试。" << std::endl;
    outfile.close();

    // 读取文件
    std::ifstream infile("example.txt", std::ios::in);
    if (!infile) {
        std::cerr << "无法打开文件进行读取" << std::endl;
        return 1;
    }
    std::string line;
    while (std::getline(infile, line)) {
        std::cout << line << std::endl;
    }
    infile.close();

    return 0;
}
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值