17370845950

C++怎么读取txt文件 C++文件流读写操作完整示例【源码】
最稳妥方式是用std::ifstream配合std::getline逐行读取,需检查is_open()、避免while(!eof())、处理中文路径用wifstream;读整文件应先seekg获取长度再read;数值解析推荐stringstream逐行处理并跳过注释与空行。

std::ifstream 读取文本文件最稳妥,别直接用 fopen 或裸指针操作;默认按行读取时注意换行符差异和末尾空行问题。

怎么安全打开并逐行读取 txt 文件

核心是用 std::ifstream 配合 std::getline,它自动处理 \n\r\n,且不会因空格截断:

  • 必须检查 is_open(),路径错误或权限不足时会静默失败
  • 不要用 while (!file.eof()) —— 它会在最后一行重复读一次,改用 while (std::getline(file, line))
  • 中文路径在 Windows 下需转为 UTF-16 并用 std::wifstream,否则可能打不开
#include 
#include 
#include 

std::ifstream file("data.txt");
if (!file.is_open()) {
    std::cerr << "无法打开文件\n";
    return;
}
std::string line;
while (std::getline(file, line)) {
    std::cout << line << "\n";
}

读取整文件到字符串(含换行符)的正确写法

想一次性读完所有内容(比如解析 JSON 或配置),不能依赖 file.rdbuf() 直接构造 std::string,因为流缓冲区不保证以 null 结尾,且二进制模式下长度计算易出错:

  • 先用 file.seekg(

    0, std::ios::end)
    获取长度,再 seekg(0) 回头
  • 分配足够空间(std::string content(size, '\0')),再用 file.read(&content[0], size)
  • Linux/macOS 换行是 \n,Windows 是 \r\n,若后续要 split,建议统一 replace
file.seekg(0, std::ios::end);
size_t size = file.tellg();
file.seekg(0);
std::string content(size, '\0');
file.read(&content[0], size);

读取数值型数据(如坐标、ID 列表)的坑

>> 提取 int/double 看似简单,但遇到格式错位会卡住或跳过后续数据:

  • file >> x >> y 遇到非数字字符(如空行、注释 #)就停止,且 failbit 被置位后不重置会一直失败
  • 推荐先用 std::getline 读整行,再用 std::stringstream 解析,可控性强
  • 忽略注释行:检查 line[0] == '#'line.find_first_not_of(" \t") == std::string::npos(纯空白行)
std::string line;
while (std::getline(file, line)) {
    if (line.empty() || line[0] == '#') continue;
    std::stringstream ss(line);
    int x, y;
    if (ss >> x >> y) {
        // 成功解析
    }
}

写入文件时编码与换行的一致性

std::ofstream 默认使用本地编码(Windows 是 GBK),写入 UTF-8 文本时若含中文,VS 编译器可能输出乱码:

  • 确保源文件保存为 UTF-8 with BOM(VS 可右键「高级保存选项」设置)
  • 写入前加 BOM:用 file (仅首次写入)
  • 跨平台换行统一用 "\n",不要手动拼 "\r\n"std::ofstream 在 Windows 下会自动转换
  • 写完务必调用 file.close() 或让对象析构,否则缓冲区内容可能未落盘

实际项目中,文件路径、编码、空行、注释、数值容错这五点加起来占了 80% 的调试时间——尤其当测试数据来自不同系统或用户手工编辑时,别假设输入“一定规范”。