我正在尝试使用std::wofstream
将unicode字符写入文件,但是put
或write
函数不写入任何字符。
示例代码:
#include <fstream>
#include <iostream>
int main()
{
std::wofstream file;
file.open("output.txt", std::ios::app);
if (file.is_open())
{
wchar_t test = L'й';
const wchar_t* str = L"фывдлао";
file.put(test);
file.write(str, sizeof(str));
file.close();
}
else
{
std::wcerr << L"Failed to open file" << std::endl;
}
std::cin.get();
return 0;
}
output.txt
文件为空,执行代码后未写入wchar / string,为什么?我在做什么错了?
编辑: 正确的代码:
#include <fstream>
#include <iostream>
int main()
{
std::wofstream file;
file.open("output.txt", std::ios::app);
if (file.is_open())
{
wchar_t test = L'й';
const wchar_t* str = L"фывдлао";
file.put(test);
if (!file.good())
{
std::wcerr << L"Failed to write" << std::endl;
}
file.write(str, 8);
file.close();
}
else
{
std::wcerr << L"Failed to open file" << std::endl;
}
std::cin.get();
return 0;
}
应用代码更正后,Failed to write
出现了,但我仍然不明白写宽字符串和字符需要做什么?
答案 0 :(得分:2)
第一个问题立即发生:put
无法写入宽字符,并且流将失败,但是您永远不会检查第一次写入是否成功:
file.put(test);
if(not file.good())
{
std::wcerr << L"Failed to write" << std::endl;
}
第二个问题是sizeof(str)
返回的指针大小以字节为单位,而不是字符串的大小以字节为单位。
答案 1 :(得分:1)
我以这种方式工作,不需要外部字符串库,例如QString!
仅使用std库和c ++ 11
#include <iostream>
#include <locale>
#include <codecvt>
#include <fstream>
#include <Windows.h>
int main()
{
std::wofstream file;
// locale object is responsible of deleting codecvt facet!
std::locale loc(std::locale(), new std::codecvt_utf16<wchar_t> converter);
file.imbue(loc);
file.open("output.txt"); // open file as UTF16!
if (file.is_open())
{
wchar_t BOM = static_cast<wchar_t>(0xFEFF);
wchar_t test_char = L'й';
const wchar_t* test_str = L"фывдлао";
file.put(BOM);
file.put(test_char);
file.write(test_str, lstrlen(test_str));
if (!file.good())
{
std::wcerr << TEXT("Failed to write") << std::endl;
}
file.close();
}
else
{
std::wcerr << TEXT("Failed to open file") << std::endl;
}
std::wcout << TEXT("Done!") << std::endl;
std::cin.get();
return 0;
}
文件输出:
йфывдлао