【发布时间】:2019-09-05 19:17:25
【问题描述】:
我有 C 代码,我正在尝试将其转换为 C++。总结一个C语言的sn-p代码如下:
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));
【问题讨论】:
-
不,出于同样的原因,代码 sn-p 要求您同时使用
fprintf()和fwprintf()。 -
sizeof(str)记住sizeof()是c++中的编译时间常数 -
您通常应该创建相同明确编码的文件或支持适当的数据序列化。您可以对
reinterpret_cast使用一些骇人听闻的技巧,但之后您将如何读取数据? -
数据被用于
wstring变量。 -
你也不能做你在 C 中出现的事情,也不能得到明确定义的结果。 C 流要么是面向字节的,要么是面向宽的,这取决于要在它们上使用的第一个 I/O 函数的性质,并且您不得(根据标准“不应”)将宽函数应用于面向字节流,反之亦然。