You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

C++处理文件时出现随机字符串乱码的问题求助

C++处理文件时出现随机字符串乱码的问题求助

看起来你遇到的是**BOM(字节顺序标记)**的问题啦!

你看到的乱码∩╗┐其实是UTF-8编码文件开头的BOM字节(EF BB BF)被当成普通文本字符解析后的结果。VSCode默认新建的UTF-8文件可能会带上这个BOM,而你的C++代码直接读取文件内容时,会把这三个字节当成字符串的一部分读进来,就出现了开头的乱码。加上你用>>读取字符串时只会读到第一个空白字符,所以就把BOM和第一个数字2连在一起输出了,也就是你看到的∩╗┐2

给你两个解决办法:

  • 方法一:修改文件编码(简单直接)
    在VSCode里,点击右下角的编码显示(比如当前显示的是“UTF-8”),选择「通过编码保存」,然后在弹出的列表里选「UTF-8(无BOM)」,重新保存你的polynomial.inp文件。这样文件开头就没有那三个特殊字节了,你的原代码就能正常读取并输出内容。

  • 方法二:在代码中跳过BOM(适合不能修改文件的场景)
    如果不想改动文件编码,可以在读取内容前先检查并跳过BOM字节,示例代码如下:

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

int main() {
  std::ifstream inpfile("./polynomial.inp", std::ios::binary);
  if (inpfile.is_open()) {
    // 检查是否存在UTF-8 BOM
    unsigned char bom[3];
    inpfile.read(reinterpret_cast<char*>(bom), 3);
    if (!(bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF)) {
      // 不是BOM的话,把文件指针移回开头
      inpfile.seekg(0);
    }
    
    // 循环读取所有内容(适配你文件里的多行数据)
    std::string str;
    while (inpfile >> str) {
      std::cout << str << " ";
    }
    inpfile.close();
  } else {
    std::cout << "无法打开文件!" << std::endl;
  }
  return 0;
};

这段代码用二进制模式打开文件,先读取前三个字节判断是否为UTF-8的BOM,若是就跳过;否则将文件指针移回开头,再正常读取所有内容。另外我把原代码的单次读取改成了循环读取,这样能输出文件里的所有数字。

备注:内容来源于stack exchange,提问作者David Pham

火山引擎 最新活动