如何使用std::wifstream读取单个字符?Windows MSVC C++开发问题
解答
你最初混淆了两个完全独立的概念:文件路径的编码格式 和 文件内容的读取格式,std::wifstream 的定位是读取宽字符格式的文件内容,不是专门用于打开Unicode路径的类。
如果你确实需要用 std::wifstream 读取单个宽字符
不需要调用read方法,直接用类自带的get()方法即可:
- 无参
get():读取单个wchar_t并返回,读取失败时返回WEOF - 传参
get(wchar_t& ch):读取结果写入传入的ch,返回流对象本身,可直接判断读取状态
示例代码:
#include <fstream> #include <iostream> int main() { std::wifstream wfs(L"你的Unicode路径.txt"); wchar_t ch; while (wfs.get(ch)) { // 处理读取到的单个宽字符ch std::wcout << ch; } return 0; }
更推荐的方案:直接用std::ifstream打开Unicode路径
如果你的文件内容是单字节文本或者二进制格式,完全不需要用std::wifstream,直接用std::ifstream打开Unicode路径即可,你整理的两个方案都是正确的:
- 方案1:
std::ifstream file(L"...");是MSVC专属扩展,Windows平台下所有支持C++11及以上的MSVC版本都可使用,兼容性最好 - 方案2:
std::ifstream file(std::filesystem::path(L"..."));是C20标准规定的通用写法,跨平台可用,但仅支持C20及以上版本的编译器
如果需要读取单个字节,直接调用std::ifstream的get()方法即可:
#include <fstream> #include <iostream> int main() { // 读取二进制文件的话要加std::ios::binary标记 std::ifstream fs(L"你的Unicode路径.txt", std::ios::binary); char ch; while (fs.get(ch)) { // 处理读取到的单个字节ch std::cout << ch; } return 0; }
内容的提问来源于stack exchange,提问作者kien
相关产品推荐
相关产品推荐

