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




