- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我使用标准 ofstream 输出文件时,它在 Notepad++ 中显示 ASCII\ANSI 编码,我认为这是正常的,但我在 UCS-2 LE 中需要这个 w/o BOM。我不知道我应该在此代码中更改什么 - 你能帮忙吗?
这是一种消息文件格式 (.vmg),在 UCS-2 LE 中进行字符编码,没有 BOM n 这就是我想在 C++ 中创建的内容。
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
double i,j;
stringstream sstream;
cout<<"Number Start from:";
cin>>i;
cout<<"\nNumber ends in:";
cin>>j;
for(i;i<=j;)
{
sstream <<i<<".vmg";
string ss = sstream.str();
ofstream sout(ss.c_str());
sout<<"BEGIN:VMSG"<<'\n'<<"VERSION:1.1"<<'\n'<<"X-IRMC-STATUS:"<<'\n'<<"X-IRMC-BOX:INBOX"<<'\n'<<"X-NOK-DT:20101224T190106Z"<<'\n'<<"X-MESSAGE-TYPE:SUBMIT"<<'\n'<<"BEGIN:VCARD"<<'\n'<<"VERSION:3.0"<<'\n'<<"N:"<<'\n'<<"TEL:"<<'\n'<<"END:VCARD"<<'\n'<<"BEGIN:VENV"<<'\n'<<"BEGIN:VCARD"<<'\n'<<"VERSION:3.0"<<'\n'<<"N:"<<'\n'<<"TEL:6969"<<'\n'<<"END:VCARD"<<'\n'<<"BEGIN:VENV"<<'\n'<<"BEGIN:VBODY"<<'\n'<<"Date:24.12.2010 19:01:06"<<'\n'<<"bid "<<i<<'\n'<<"END:VBODY"<<'\n'<<"END:VENV"<<'\n'<<"END:VENV"<<'\n'<<"END:VMSG"<<endl;
sstream.str("");
i=i+0.01;
}
return 0;
}
最佳答案
C++ std::string
没有显式编码(它们只是 char
的容器)。
您需要确定几件事:
然后你就会知道如何在两者之间进行转换。
选择固定宽度的内部表示形式很有用,例如 UTF-16
或 UTF-32
(我在技术上知道 UTF-16
不是固定宽度,但 UCS-2
是并且足够接近)。
外部表示不需要固定宽度,但您似乎需要 UCS-2 (UTF-16)。因此,如果您选择一种与外部格式相匹配的内部格式,则不需要转换,您只需将字符串输出到流中即可。
如果您的内部表示和外部表示之间存在差异(如 LE -> BE),您需要在两者之间进行转换。为此,请使用 codecvt
facet 并使用适当的 locale
imbue
文件流。说明可在此处找到:writing-utf16-to-file-in-binary-mode
您知道内部编码(因为您做出了选择)。
外部编码:这取决于文件:
如果您创建了该文件,您就会知道它的编码。如果另一个程序创建了该文件,您可能必须计算出编码。例如通过阅读 BOM
(字节顺序标记)在文件的开头。这样你就可以判断它是 UTF-8
、UTF-16LE
、UTF-16BE
还是 UTF-32
。
如果是其他编码,尝试计算出来可能会比较困难,或者您只能猜测一下。
关于c++ - 在不带 BOM 编码的 UCS-2 LE 中使用标准 ofstream 编写 C++ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4528380/
我想在一个函数中打开一个文件,将打开的文件对象返回给 main,并在另一个函数中使用它函数来填充文件。编译器似乎告诉我,我正在尝试访问 iostream 的私有(private)成员。有没有办法做到这
我最近写了一个记录器类。编译这段代码时: std::ofstream *stream = new std::ofstream; stream->open( log_file_name.c_str()
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
我正在尝试实现一个记录器,它可以注册到多个流,如 ostringstream、ofstream 等。我试图实现这样的功能 void register_stream(std::ostream& a);
我有一个在线程上写入文件的类 class A{ public: void writeToFile(ofstream& outFile, obj &a) { //...
我有以下代码 void _log_message(const char* fmt, ...) { va_list arg; ofstream logfile; cout << "Open Lo
我刚刚开始阅读如何打开和编辑文件。使用 ifstream 时,如果文件不存在,则不会创建它。 引用下面的代码,条件 (!outfile) 何时为假,就好像文件不存在一样,构造函数将简单地创建它,因此总
#include #define LOGFATAL(msg) log(0, msg) std::ofstream *logst = NULL; void log(int sev, char *msg
我在使用 ofstream 时遇到问题一次将两个不同的输出写入两个不同的文件。程序编译运行正常,并向p1output.txt写入数据,但是当我打开p2output.txt时,除了第一行内容外是空白的:
我有一个“资源模块”类来管理我的应用程序的所有资源,它主要从一个包含所有内容的文件“RESOURCES.DAT”中读取。 从文件中请求新数据的所有对象都通过 ResourceModule,因此我可以管
我遇到流问题,程序无法打开我要写入的文件。最小完整可变代码如下: #include #include using namespace std; int main(){ string roo
我已经研究了好几个小时了,我只知道答案很简单。似乎无论我做什么我都无法打开文件。这是一个多类程序,所以在标题中我有 #include #include class A{ string path
所以我想写一个可以像这样使用的缩进输出类: Debug f; f.open("test.txt"); f }' and '') ofs #include using namespace std;
大家好... 抱歉我的英语不好,但是会说西类牙语... 这周,为了这个proyect的学习和工作,我想创建一个软件来制作文件(.us)... 示例 char name[50]; //Or string
我不想在 main() 中构造 ofstream。这是我所做的,但它没有编译: #include using namespace std; class test { private: ofs
谁能告诉我这是怎么回事? #include #include #include #include #include class writeManager { std::vector
我有一个 C++ 类,它将其数据写出到二进制 std::ofstream。该类将数据存储为 boost:shared_array 但我已经消除了这个问题。问题出在 ofstream 上对 write(
在我的程序中,我的 dataout: void outfile 没有写入文件,任何人都可以找出原因吗? using namespace std; #include #include #include
我想在文件上写点东西。但它只是没有像它必须假设的那样编写。 void main() { int accno; char name[20]; float deposit;
我遇到了一个奇怪的问题。我有两个函数,它们都有一个通过引用传递的 ofstream。但是,当我调用第二个函数时,正在打印第一个函数的一部分。 这是第一个函数: void GamePlay::dealD
我是一名优秀的程序员,十分优秀!