我有要转换为C ++的C代码。总结一下C语言中的代码片段,如下所示:
FILE *fp = fopen("temp.bin", "wb");
wchar_t* wide_word = _T("wide char");
char* word = "char";
fwprintf(fp, _T("%s"), wide_word);
fprintf(fp, "%s", word);
在C情况下的优点是我们可以通过简单地传递指针来继续使用相同的fp指针同时打印char和wide char。我们是否可以在C ++中实现相同的功能而无需初始化对象ofstream
和wofstream
来写入同一文件并获得与上述C实现完全相同的输出?
我在C ++中尝试了以下方法(还有许多其他事情)
auto os = std::ofstream("temp_cpp.bin", std::ios::binary | std::ios::out);
wchar_t* wide_word = _T("wide char");
char* word = "char";
std::wstring st(wide_word);
std::string str(st.begin(),st.end());
os.write(reinterpret_cast<const char*>(str.c_str()), sizeof(str));
os.write(reinterpret_cast<const char*>(word), sizeof(word));
答案 0 :(得分:2)
是的,您可以使用相同的write
函数将ANSI字节或宽字符字节写入文件。代码中有一些错误。 sizeof(str)
将返回std::string
对象的大小,而不是字符串的长度,而sizeof(word)
将返回指针的大小,同样不是字符串的长度(尽管您可能会幸运的是,在32位系统上,指针的大小与您的字符串长度匹配)。此外,您正在编写两次ANSI字符,而不是先编写宽字符,然后再按照fprintf
示例编写ANSI字符。您在那写的意思可能是:
auto os = std::ofstream("temp_cpp.bin", std::ios::binary | std::ios::out);
const wchar_t* wide_word = L"wide char";
const char* word = "char";
std::wstring st(wide_word);
std::string str(st.begin(), st.end());
os.write((const char*)(st.c_str()), st.length() * sizeof(wchar_t));
os.write(word, strlen(word));
这将产生与您的fprintf
示例相同的文件内容(但是不能保证,因为它可能取决于setLocale
)。或者,不使用std::wstring
:
auto os = std::ofstream("temp_cpp.bin", std::ios::binary | std::ios::out);
const wchar_t* wide_word = L"wide char";
const char* word = "char";
os.write((const char*)wide_word, wcslen(wide_word) * sizeof(wchar_t));
os.write(word, strlen(word));
是否建议将不同的文本编码写入同一文件是另一个问题。