问题标签 [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.

0 投票
3 回答
21857 浏览

c++ - (w)ifstream 是否支持不同的编码

当我使用 wifstream 将文本文件读取为宽字符串 (std::wstring) 时,流实现是否支持不同的编码 - 即它可以用于读取例如 ASCII、UTF-8 和 UTF-16 文件吗?

如果没有,我该怎么办?

(我需要阅读整个文件,如果有区别的话)

0 投票
1 回答
1286 浏览

g++ - Windows 上的 iostream、wifstream 和 eclipse/g++

我在带有 MinGW 工具链(g++ 等)的 Windows 上使用 Eclipse。我有一个基于 darwin 构建的程序,它使用 wifstream 和 wofstream 读取和写入文件。该程序在 darwin (Mac) 上使用 eclipse 编译和工作...对于我的问题没有。

当我将代码移到 Windows 并尝试使用 MinGW 工具链和 eclipse 进行构建时,我在 wifstream、wofstream 和 wcout 上遇到编译错误。定义为 wstring 的变量编译得很好。

例如:

wifstream inFile; inFile.open(argv[2], ios_base::in);

导致编译错误

..\src\pdConv.cpp:31: 错误: `wifstream' 未在此范围内声明

这似乎表明编译器认为 wifstream 是一个变量。我确实注意到包含文件中未启用 _GLIBCXX_USE_WCHAR_T 指令。我需要自己定义它还是环境中的某些东西应该知道这一点?如果我手动定义它,那么看来我不能在同一个程序中同时使用宽和窄实现。

这可能很明显,但我已经被这个问题困了很久......大声笑..我在这里错过了什么?

0 投票
2 回答
4873 浏览

c++ - 如何使用 std::wifstream 将其内容作为 std::wstring 读取

我正在尝试这个:

但我得到了这个编译错误:

我了解运算符 >> 未针对 wchar_t 实现。

我发现很少有文档和对 std::wifstream 的引用。你将如何使用它?

0 投票
2 回答
4456 浏览

c++ - 在 C++ 中以 Cyrillic 读写文件

我必须首先读取西里尔文的文件,然后随机选择随机行数并将修改后的文本写入不同的文件。拉丁字母没有问题,但我遇到了西里尔文字的问题,因为我得到了一些垃圾。所以这就是我尝试做这件事的方式。

说,文件input.txt

我必须阅读它,并将每一行放入一个向量中:

那么我怎样才能使用西里尔文,使它产生可读的东西,而不仅仅是符号呢?

0 投票
3 回答
6164 浏览

c++ - 如何使用 C++ 在 Win 上读写 UTF16 文件

关于这一点有很多关于 SO 的问题,但其中大多数都没有提到将 wstring 写回文件。因此,例如,我发现这是为了阅读:

我尝试了类似的东西来写作:

但它会产生垃圾,(或 Notpad++ 和 vim 无法解释它)。正如标题 Im on Win、本机 C++、VS 2010 中所述。

输入文件:

结果是这样的:

转换为十六进制:

vim 正常输出:

t^@¬ s^@t^@U^@T^@F^@1^@6^@!'^M^@ ^@t^@e^@s^@t^@

编辑:我最终使用了 UTF8。Andrei Alexandrescu 说这是最好的编码,所以没有大的损失。:)

0 投票
2 回答
2374 浏览

c++ - 如何从写入文件中的 UTF-8 编码的 URDU 字符串中获取单个字符?

我正在研究乌尔都语印地语翻译/音译。我的目标是将乌尔都语句子翻译成印地语,反之亦然,我正在使用 Visual c++ 2010 软件和 c++ 语言。我在保存为 UTF-8 格式的文本文件中写了一个乌尔都语句子。现在我想从该文件中一个一个地获取单个字符,以便我可以处理它以将其转换为等效的印地语字符。当我尝试从输入文件中获取单个字符并将该单个字符写入输出文件时,我在输出文件中得到了一些不知名的丑陋字符。请帮助我正确的代码。我的代码如下

0 投票
1 回答
3284 浏览

c++ - 求istreambuf_iterator澄清,阅读 Unicode 字符的完整文本文件

在 Scott Meyers 的“Effective STL”一书中,有一个很好的例子,将整个文本文件读入 std::string 对象:

请注意,它将其读取为 8 字节字符。这很好用。最近虽然我需要读取一个包含 Unicode 文本的文件(即每个字符两个字节)。但是,当我尝试(天真地)更改它以将数据从 Unicode 文本文件读取到 std::wstring 对象时,如下所示:

我得到的字符串虽然是宽字符,但仍然具有备用空值。例如,如果文件包含 Unicode 字符串“ABC”,则文件的字节(忽略 0xFF、0xFE 的 Unicode 前导字节)为:<'A'> <0> <'B'> <0> <' C'> <0>

上面的第一个代码片段将正确生成 (char) 字符串的以下内容:
sData [0] = 'A'<br> sData [1] = 0x00
sData [2] = 'B'<br> sData [3 ] = 0x00
sData [4] = 'C'<br> sData [5] = 0x00

但是,当运行第二个代码片段时,它会意外地导致 (wchar_t) 字符串的以下内容:
wsData [0] = L'A'<br> wsData [1] = 0x0000
wsData [2] = L'B '<br> wsData [3] = 0x0000
wsData [4] = L'C'<br> wsData [5] = 0x0000

就好像文件仍在被逐字节读取,然后只是简单地翻译成单独的 wchar_t 字符。

我会认为专门用于 wchar_t 的 std::istreambuf_iterator 应该导致文件一次读取两个字节,不是吗?如果不是,那它的目的是什么?

我已经追踪到模板(不容易的壮举;-),并且迭代器确实似乎仍然在逐字节读取文件并将其传递给其内部转换例程,该例程尽职尽责地声明转换是在每个字节之后完成的(不是仅在收到 2 个字节后)。

我已经在网络上搜索了许多网站(包括这个网站)来寻找这个看似微不足道的任务,但没有找到对这种行为的解释或一个很好的替代方案,它不涉及比我认为必要的更多代码(例如,A Google网络搜索也会产生相同的第二个代码片段作为可行的代码段)。

我发现唯一可行的是以下内容,我认为这是作弊,因为它需要直接访问 wstring 的内部缓冲区,然后对其进行类型强制。

哦,为了避免不可避免的“为什么以二进制模式打开文件,为什么不以文本模式打开文件”的问题,打开是故意的,好像文件是以文本模式打开的(默认),这意味着 CR/LF ("\ r\n" 或 0x0D0A) 序列将仅转换为 LF("\n" 或 0x0A)序列,而文件的纯字节读取将保留它们。无论如何,对于那些顽固分子来说,改变这一点毫无疑问是没有效果的。

所以这里有两个问题,为什么第二种情况不能像预期的那样工作(即,这些迭代器发生了什么),以及你最喜欢的将 Unicode 字符文件加载到 wstring 中的“犹太 STL 方式”是什么?

我在这里想念什么;它一定很愚蠢。

克里斯

0 投票
1 回答
5649 浏览

c++ - 读取随机访问文件

我开发了一个 C++ 应用程序,用于在随机访问文件上读取和写入数据。(我使用 Visual C++ 2010)

这是我的程序:

输出是:

但我期待 Text2: Hello。问题是什么??

顺便说一句,我怎样才能output.write在我的班级内(在一个函数中)?

谢谢

0 投票
0 回答
675 浏览

c++ - 带有 imbue 的 wifstream,语言环境会产生 valgrind 错误

我使用 ngrams 实现了一个语言检测器,到目前为止一切正常。为了检测一堆语言,在实际检测开始之前,我的检测器需要读取的每种支持的语言都有一组语言相关的 ngrams 文件。

为了读取这些文件,我像这样设置系统默认语言环境(在我的 ubuntu 机器上是 en_US.UTF-8)。这些代码片段在我的language_identifier构造函数中:

在打开流之前,我通过 imbue 设置语言环境:

执行我的检测器,valgrind 给我以下输出:

我不完全记得也没有机会检查,但在我的 ubuntu 10.04 LTS 机器上我没有上述 valgrind 错误,但我可能弄错了。

我也可以用这个简单的程序重现这个:

有人知道这里发生了什么吗?我错过了什么吗?

代码基于 ubuntu 12.04LTS,使用 gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

感谢您的提示!

0 投票
1 回答
174 浏览

c++ - 使用流将类对象写入文件

我有这个代码来序列化/反序列化类对象到文件,它似乎工作。但是,我有两个问题。

  1. 如果我想在我的班级中有一个和一个成员变量,而不是两个wstring(就像我现在一样)怎么办?(我认为在这种情况下我的代码不起作用?)。wstringstring
  2. 最后,在下面,主要是,当我初始化s2.product_name_= L"megatex";if 而不是 megatex 我用俄语写一些东西时(例如,s2.product_name_= L"логин"),代码不再按预期工作。

有什么问题?谢谢。

这是代码: