如何将wstring和char[32]同时写入文件

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个�)



不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题解决方案:

    将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]同时写入文件了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^