C++ 怎么读取txt文件 C++ ifstream流逐行读取完整代码【IO】

发布时间 - 2026-01-31 00:00:00    点击率:
正确写法是用std::getline(file, line)配合while循环,构造后立即检查is_open(),每行内容不含换行符需手动加\n;避免operator>>、eof()判据及未检查打开失败等常见

错误。

std::ifstream 逐行读取 txt 文件的正确写法

直接上最稳妥、无坑的写法:必须用 std::getline() 配合 std::ifstream,不能用 operator>>(会跳过空白、截断空行、遇到空格就停)。文件路径建议用绝对路径或确保工作目录正确,否则 is_open() 会返回 false

常见错误现象:while (file >> line) 导致只读到第一词;while (!file.eof()) 多循环一次;没检查打开失败就直接读,程序崩溃或静默跳过。

  • std::ifstream 构造后立刻用 .is_open() 判断,别信“构造成功=文件存在”
  • std::string line 接收,std::getline(file, line) 是唯一推荐的逐行方式
  • 循环条件写成 while (std::getline(file, line)) —— 它内部自动检测流状态,安全且简洁
  • 中文路径在 Windows 下需用 std::wifstream + std::locale,普通 ifstream 只支持 ASCII 路径名

std::getline() 读到换行符就停,但不包含它

这是关键细节:每调用一次 std::getline(),读入的内容是换行符之前的所有字符,line 字符串里不含 \n\r\n。所以打印时要自己加 \n,否则所有行会挤在一起。

如果原文件最后一行没换行符,std::getline() 依然能正常读取该行内容(只要流未失效);但如果最后一行为空且无换行,它会被忽略——这不是 bug,是标准行为。

  • 想保留原始换行风格(比如区分 \r\n\n),得改用 file.get() 逐字节读,getline() 不提供此能力
  • getline() 的第三个参数可自定义分隔符(如 ','),但逐行场景下保持默认 \n 即可
  • 若某行超长,std::string 会自动扩容,无需预估缓冲区大小

完整可运行代码(含错误处理)

#include 
#include 
#include 

int main() {
    std::ifstream file("data.txt");
    if (!file.is_open()) {
        std::cerr << "无法打开文件: data.txt\n";
        return 1;
    }

    std::string line;
    int lineno = 0;
    while (std::getline(file, line)) {
        lineno++;
        std::cout << "[" << lineno << "] " << line << "\n";
    }

    if (file.bad()) {
        std::cerr << "读取发生底层 I/O 错误\n";
    }
    // eof() 为 true 是正常结束,不用报错
    return 0;
}

这段代码在 Linux/macOS 下直接编译运行即可;Windows 下若 data.txt 是 UTF-8 带 BOM,可能首行乱码——这不是代码问题,是记事本编码导致,用 VS Code 保存为 “UTF-8 无 BOM” 即可。

为什么不用 fscanf 或 C 风格 fgets

纯 C 函数在 C++ 里能用,但绕过了 RAII 和异常安全机制:fopen 必须配对 fclose,忘了就内存泄漏;fgets 需手动指定缓冲区大小,容易溢出;fscanf 对格式敏感,一行缺个数字就卡住或跳行。

std::ifstream 析构时自动关闭文件,std::string 自动管理内存,getline() 返回流引用便于链式判断——这些不是“更高级”,而是避免低级错误的刚需。

  • 跨平台兼容性:C++ 流在各编译器行为一致;C 文件函数在不同 CRT 实现中对换行/编码处理略有差异
  • 调试友好:file.fail()file.bad()file.eof() 可精确区分错误类型,C 函数只能靠 errno
  • 和现代 C++ 生态无缝衔接:配合 std::vector<:string> 存所有行、用范围 for 遍历、lambda 处理每行,都很自然

真正容易被忽略的是:文件编码、BOM、行尾符、权限错误这四类问题,它们不会让代码编译失败,却会让输出为空或乱码——排查时优先看文件本身,而不是重写读取逻辑。


# linux  # windows  # 编码  # 字节  # mac  # ai  # c++  # ios  # macos  # win  # stream  # vs code  # EOF  # String  # for  # while  # fopen  # fclose  # fgets  # 字符串  # errno  # 循环  # Lambda  # ifstream  # operator  # bom  # ASCII  # bug  # 换行符  # 换行  # 这不是  # 会让  # 不含  # 链式  # 跳过  # 为空  # 的是  # 这是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS中新建站点并配置端口与IP地址?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  网站制作报价单模板图片,小松挖机官方网站报价?  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  JavaScript如何实现音频处理_Web Audio API如何工作?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作旅游网站html,怎样注册旅游网站?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Python面向对象测试方法_mock解析【教程】  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何在企业微信快速生成手机电脑官网?  Laravel中的withCount方法怎么高效统计关联模型数量  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  如何选择PHP开源工具快速搭建网站?  如何用低价快速搭建高质量网站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel怎么实现模型属性的自动加密  制作企业网站建设方案,怎样建设一个公司网站?  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  移动端脚本框架Hammer.js  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Python文件异常处理策略_健壮性说明【指导】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  微信小程序 scroll-view组件实现列表页实例代码  如何在IIS7上新建站点并设置安全权限?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  详解Android——蓝牙技术 带你实现终端间数据传输  Android实现代码画虚线边框背景效果  Laravel如何使用查询构建器?(Query Builder高级用法)  如何在VPS电脑上快速搭建网站?  Laravel如何为API生成Swagger或OpenAPI文档  Laravel如何使用Blade模板引擎?(完整语法和示例)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Bootstrap整体框架之CSS12栅格系统  如何有效防御Web建站篡改攻击?  使用spring连接及操作mongodb3.0实例