使用同一对象写入宽字符,并将字符写入同一文件

时间:2019-04-15 18:40:16

标签: c++ c stream fstream

我有要转换为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 ++中实现相同的功能而无需初始化对象ofstreamwofstream来写入同一文件并获得与上述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));

1 个答案:

答案 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));

是否建议将不同的文本编码写入同一文件是另一个问题。