问题标签 [wifstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么我无法读取长度超过 4094 个字符的 UTF-16 文件?
一些信息:
- 我只在 Linux 上试过这个
- 我已经尝试过 GCC (7.2.0) 和 Clang (3.8.1)
- 据我了解,它需要 C++11 或更高版本
当我运行它时会发生什么
我得到重复的预期字符串“abcd”,直到它到达 4094 个字符的位置。之后它输出的就是这个符号“?” 直到文件结束。
我怎么看这件事?
我认为这不是预期的行为,它一定是某个地方的错误。
您可以使用以下代码进行测试:
c++ - 如何在 C++ 中处理 ifstream、cout 等的多个语言环境
我正在尝试读取和处理多个不同编码的文件。我应该只为此使用 STL。假设我们有iso-8859-15和UTF-8文件。
在这个SO 答案中,它指出:
简而言之,对您来说更有趣的部分:
std::stream
(stringstream
,fstream
,cin
,cout
) 有一个内部语言环境对象,它与创建流对象时的全局 C++ 语言环境的值相匹配。正如std::in
在调用 main 中的代码很久之前创建的那样,它很可能具有经典的 C 语言环境,无论您之后做什么。- 您可以通过调用来确保 std::stream 对象具有所需的语言环境
std::stream::imbue(std::locale(your_favorite_locale))
。
问题在于,在这两种类型中,只有与首先创建的语言环境匹配的文件才能被正确处理。例如,如果locale_DE_ISO885915
在前面, 则未正确附加在其中的locale_DE_UTF8
文件,当我将它们取出时,我只看到文件中的几行。UTF-8
string s
cout
正如您在代码中看到的那样,我尝试过global
但locale local variables
无济于事。
此外,在如何使用 std::imbue 为 std::wcout 设置语言环境?所以回答它说:
所以看起来确实有一个底层 C 库机制,应该首先使用 setlocale 启用,以允许 imbue 转换正常工作。
这种“晦涩”的机制是这里的问题吗?
处理文件时是否可以在两种语言环境之间交替?我应该灌输什么(,,cout
?)以及如何灌输?ifstream
getline
有什么建议么?
PS:为什么和locale相关的一切都这么乱?:|
c++ - 未能找到存在于 std::wstring 中的 wchar_t
当我遇到一个奇怪的行为时,我正在玩std::wstring
and 。std::wfstream
即,似乎std::basic_string<wchar_t>::find
无法找到某些字符。考虑以下代码:
在这里,我只是读取文件的第一行input
并将其写入output
文件。程序运行前,第一个文件的内容aąbcćd
为空,输出文件为空。执行代码后,输入文件成功复制到输出文件中。
令我惊讶的是,我试图在 中找到ć
一封信buf
并遇到了提到的奇怪行为。程序执行后,我确认输出文件中包含的正是aąbcćd
,其中显然包含了提到的字符ć
。
然而,这条线的std::cout << buf.find(L'ć')
表现并不像预期的那样。4
考虑到 的内存布局,我没想到会得到 的输出std::wstring
,但我也绝对没想到会得到std::string::npos
。值得一提的是,用这种方法查找常规 ASCII 字符是成功的。
综上所述,上述代码正确地将输入文件的第一行复制到输出文件,但它未能在字符串中找到一个字符(返回 npos),该字符负责保存要复制的数据。为什么呢?是什么导致find
这里失败?
注意:这两个文件在 Windows 上都是 UTF-8 编码的。
c++ - 为什么 `wifstream` 上的 `getline` 从 UTF-16 编码文件中读取乱码输入?
在尝试从这个答案中读取带有提示的 UTF-16 编码文件时,我遇到的问题是,在读取了几千个字符后,getline
-method 开始在垃圾 mojibake 中读取。
这是我的主要内容:
该test.txt
文件包含FF
,FE
字节顺序标记,后跟 100 行,'a'
每行 80 s。test.txt
这是在 *nix上生成的 bash 脚本:
这是我编译和运行主程序的方式:
我所期望的:'a'
打印了 8000秒。
实际发生了什么:
打印几千a
秒后,输出变为以下垃圾:
aaaaaaaaaa愀愀愀愀愀愀愀愀愀愀
有时看起来像0A00
矩形的不可打印字符。
-character的愀
二进制代码点值为110000100000000
,因此它看起来像a
-byte 后跟0
-byte。
似乎在读取过程中丢失了一些字节,从那时起,一切都错位了,所有剩余的符号都被错误地解码了。或者,因为输出以0A00
-thingie 结尾,可能是在读取几千个a
s 后字节序反转,但这种行为也没有任何意义。
为什么会发生这种情况,最简单的解决方法是什么?
c++ - 如何让 C++ wfstream 使用 Unicode 文件路径?
我有一个使用 utf-8 编码的宽字符串处理文件 I/O 的应用程序。
工作代码:
但是,一旦在文件路径中引入了 unicode 字符,文件将不再正确打开。IE。以下代码不起作用并返回 false:
我在这里做错了什么?似乎应该有一种简单的方法来让 wfstream 与 unicode 文件路径一起工作,但我已经在互联网上进行了搜索,但找不到。
谢谢
c++ - 当我使用 wstring 和 wchar_t 时,模板出现问题
我编写了一个将字符串转换为向量的函数。现在我想制作一个类型的模板,因为我还想使用 wstrings 和 wchar_t。因为它们在 csv 文件中。这是我的文件...
主文件
vector_to_string.cpp
翻译.csv
问题出在 vector_to_string () 但我找不到问题,我得到这个语法错误......
问题是什么,我怎样才能最好地解决它?
c++ - 如何为 std::wifstream 编写随机访问迭代器?
我的正常程序如下:
问题是第二步需要很多时间,因为文件很大。总文件内容被加载到 wstring 上,这通常不是必需的,因为 boost::algorithm::boyer_moore 无论如何都会跳过读取大部分内容。
因此,跳过该步骤将大大提高速度,因此我需要一个在 std::wifstream 上的随机访问迭代器,例如 std::wifstream::const_iterator。
如何简洁地实现一个?