using namespace std;
int main()
{
wstring directory_of_files[8192];
//这里对directory_of_files进行了赋值
/* 创建输出文件 */
wofstream exportation("D:\\1.txt",ios::app);
if (!exportation.is_open())
{
cout << "文件写入异常。\n";
return -2;
}
for (int j = 0; j < fileCount; j++)
{
char current_sha256[32];
GetHASH(SHA256, directory_of_files[j], current_sha256);
exportation << endl << directory_of_files[j] << endl;
exportation.write((wchar_t*)current_sha256,32);
}
这种情况下,理应写入为:
D:\230311_001.MP3
c52e2a6e8a8d1919c52cff632a681071
D:\230311_002.MP3
15cfa3c24e82371d259d8525a52ed02e
但实际只写入了:
D:\230311_001.MP3
另一种代码这么写的:
exportation << directory_of_files[j] << endl << current_sha256 << endl;
输出应该一致,但这种情况下输出了:
不知道你这个问题是否已经解决, 如果还没有解决的话:D:\Peter\Bilibili Movies\230311_001.MP3
c52e2a6e8a8d1919c52cff632a681071597b50e789d8a4e2fe411b936b64612d�(这里有272个�)
问题解决方案:
将wstring和char[32]同时写入文件需要将宽字符串转换为char字符串,可以使用wcstombs进行转换。同时,在写入char[32]时,需要注意其长度只有32,只能写入其实际占用的字节,否则会造成写入数据过多,导致文件数据混乱。修改后的代码如下:
std::wstring my_wstring = L"这是我的 wstring";
char my_char[32] = "这是我的 char[32]";
std::ofstream myfile("myfile.txt", std::ios::binary);
if (myfile.is_open())
{
//将my_wstring转换为char字符串并写入文件
const size_t wstr_size = my_wstring.size() + 1;
std::unique_ptr<char[]> my_char2(new char[wstr_size]);
wcstombs(my_char2.get(), my_wstring.c_str(), wstr_size);
myfile.write(my_char2.get(), wstr_size);
//将my_char写入文件
const size_t char_size = strlen(my_char) + 1;
char my_char3[32];
memset(my_char3, 0, sizeof(my_char3));
strcat(my_char3, my_char);
myfile.write(my_char3, char_size);
myfile.close();
}
这样就可以成功地将wstring和char[32]同时写入文件了。