You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序stdout重定向后出现怪异字符与多余空字符问题

问题根因

你观测到的异常是Windows PowerShell的默认重定向行为导致的,和你的C++代码读写逻辑无关:

  • 开头固定的ÿþ是UTF-16 LE编码的字节序标记(BOM,对应字节0xFF 0xFE)
  • 字符之间的多余\0是UTF-16编码的特征:单个ASCII字符会用2个字节存储,高位字节补0,所以你会看到每个可见字符后面跟着一个隐藏的\0
  • PowerShell在使用>操作符重定向程序输出到文件时,默认会把程序输出的字节流转成UTF-16 LE编码后再写入文件,哪怕你的程序输出的是纯ASCII内容也会被强制转码,这就是你不管用std::cout、printf还是手动拼字符数组输出都有相同问题的原因。
解决方案

任选以下任意一种方案即可解决:

  • 修改PowerShell本次会话的默认重定向编码,执行重定向前先运行:
    $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
    
    之后运行main.exe > my_log.txt生成的就是正常的UTF-8编码文件
  • 直接在CMD而非PowerShell中执行重定向命令,CMD默认不会修改程序输出的字节流,直接写入原内容
  • 不需要shell重定向的话,直接在C++代码中用std::ofstream写输出到目标文件,完全绕开shell的转码逻辑
  • 如果需要固定程序输出行为不受shell影响,可以在C++代码main函数开头强制指定控制台输出编码:
    #include <windows.h>
    
    int main() {
        SetConsoleOutputCP(CP_UTF8);
        // 原有业务逻辑
    }
    
额外代码优化建议

你现有代码中的while (!my_file.eof())写法存在逻辑问题,会导致多读一行空内容,建议改成:

std::string line;
while (std::getline(my_file, line)) {
    // 解析line的逻辑
}

内容的提问来源于stack exchange,提问作者user2840470

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:06:05