C++中vector<char>转string后输出编码异常问题排查
问题原因分析与解决方法
核心问题原因
- 路径转义错误:Windows路径中的
\需要转义为\\,原代码里的C:\Users\{USER}\...会将\U、\D等视为无效转义,导致文件路径解析错误,读取内容异常。 - 文件指针重复移动:
ifs.get()会自动移动读写指针,后续又调用ifs.seekg(index),导致指针位置混乱,读取的字符序列错误。 - printf参数错误:直接将
std::string传给printf("%s")不符合要求,%s需要以\0结尾的C风格字符串,而std::string的底层存储不一定包含终止符,导致输出乱码。 - 未处理EOF:读取到文件末尾时,
ifs.get()返回的EOF(值为-1)会被存入vector,引入非法字符造成乱码。
修复后的代码
#include <iostream> #include <stdio.h> #include <vector> #include <string> #include <fstream> #define WT_SPACE 0x20 #define LF 0x0A #define CR 0x0D #define COLON 0x3A int main() { std::ifstream ifs; std::vector<char> buf; std::string key; std::string value; // 修复路径转义,使用双反斜杠 ifs.open("C:\\Users\\{USER}\\Documents\\Programs\\request_parser\\request.exmp", std::ifstream::in); if (ifs.is_open()) { char e; // 简化读取逻辑,自动处理指针移动,直到遇到空格或文件结束 while (ifs.get(e) && e != WT_SPACE) { buf.push_back(e); } std::string str(buf.begin(), buf.end()); // 使用c_str()获取C风格终止字符串 printf("%s\n", str.c_str()); // 更推荐用C++原生输出:std::cout << str << std::endl; } else { printf("Failed to open IFS"); } return 0; };
更简洁的实现方式
如果只是读取第一个空格前的令牌,完全可以省略手动操作vector的步骤,直接用std::string的输入运算符:
// 替换读取部分代码 std::string str; ifs >> str; // 自动以空白字符为分隔符读取第一个令牌 std::cout << str << std::endl;
内容的提问来源于stack exchange,提问作者Zambieslar
相关产品推荐
相关产品推荐

