- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个如下的文件:
$ xxd 1line
0000000: 3939 ba2f 6f20 6f66 0d0a 99./o of..
我想用 C++ 阅读这一行:
#include <codecvt>
#include <iostream>
#include <locale>
#include <fstream>
#include <string>
int main(int argc, char** argv) {
std::wifstream wss(argv[1], std::ios::binary);
wss.seekg(std::ios_base::end);
const auto fileSize = wss.tellg();
wss.seekg(std::ios_base::beg);
// std::locale utf8_locale(wss.getloc(), new std::codecvt_utf8<wchar_t, 0x10FFFF, std::consume_header>);
// wss.imbue(utf8_locale);
std::wstring wline;
std::getline(wss, wline);
std::cout << "filelen: " << fileSize << std::endl;
std::cout << "strlen: " << wline.size() << std::endl;
std::wcout << "str: " << wline << std::endl;
return 0;
}
我用下面的方式编译它:
$ g++ -std=c++11 imbue_issue.cpp
第一件事:wss.seekg(std::ios_base::end) 似乎没有移动文件末尾的文件位置:
$ ./a.out 1line
filelen: 2
strlen: 9
str: 99?/o of
第二件事是当取消注释与区域设置相关的行时,getline 只读取 2 个字符:
$ ./a.out 1line
filelen: 2
strlen: 2
str: 99
我的编译器:
$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
有谁知道此文件出现上述问题的原因是什么?
最佳答案
问题是你如何调用the seekg
function .当您使用一个参数调用它时,它被用作从一开始的绝对位置,您将寻找 std::ios::end
具有的任何值,这会发生在您的情况下为 2
。
相反,您应该使用双参数重载:
wss.seekg(0, std::ios_base::end); // Seek to offset 0 from the end
使用宽字符类型读取文件仍然会有问题,因为内容似乎不是那样。 UTF-8 是一种多字节窄字符编码。
关于c++ - wifstream 中的 seekg 和 imbue 工作错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40102998/
当我使用Visual Studio 2019时,它为我带来了绿色的花样: #include #include int main() { // Green squiggles given f
编译器:Visual Studio 2019(C++20,最新) 我有一个关于 std::locale 的问题 是否不可能调用 std::cout.imbue 多个? 为什么不可能? 当我运行下面的代
我正在尝试在 C++ 中找到与以下内容等效的 C#。这纯粹是为了好玩 #include #include #include class CommaSep : public std::numpun
我正在使用 Boost 将“2000 年 1 月 1 日”形式的日期转换为儒略数。我这样做的方法是使用 int toJulian(std::string date) { std::locale
我的编译器是Visual VC++ 2013。下面最简单的程序会导致一些内存泄漏。 为什么?如何修复? #define _CRTDBG_MAP_ALLOC #include #include #i
在带有 g++ 的 linux 上,如果我设置了 utf8 全局语言环境,则 wcin 会正确地将 UTF-8 转码为内部 wchar_t 编码。 但是,如果我使用经典语言环境并将 UTF8 语言环境
我在 Windows 上,我正在从 std::string 构造 std::filesystem::path。根据构造函数引用(强调我的): If the source character type
我正在 Android 上部署一个 C++ 应用程序,它使用 boost::date_time .它有很多库,有些是在编译时链接的(共享库),有些是插件,在运行时通过 dlopen 动态加载。 .在某
我有一个如下的文件: $ xxd 1line 0000000: 3939 ba2f 6f20 6f66 0d0a 99./o of.. 我想用 C++ 阅读这一行: #
对于这个相当本地化的问题,我深表歉意,但我希望得到其他人的看法,以确保我没有做明显错误的事情。 我相信我在 Visual C++ 运行时库或 Microsoft 的 std::stringstream
我正在尝试使用 C++11 中的 std::locale 机制来计算不同语言的单词。具体来说,我有 std::wstringstream ,其中包含着名的俄罗斯小说的标题(英文为“犯罪与惩罚”)。我想
boost::filesystem::path::imbue(std::locale()); 效果不错。 下一个代码: boost::filesystem::detail::utf8_codecvt_
我在 Mac OS X (10.6.7) 下遇到了与 GUI/线程相关的问题。我正在使用 wxWidgets 框架(版本 2.9.1),在我的例子中它依赖于 Cocoa。应用设计是这样的: 线程 #1
我是一名优秀的程序员,十分优秀!