Wrote to a file using std::wofstream. The file remained empty

Viewed 15887

I wrote the following program using VS2008:

#include <fstream>
int main()
{
    std::wofstream fout("myfile");
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
}

When I tried to compile it the IDE asked me whether I wanted to save my source file in unicode, I said "yes, please".
Then I run the program, and myfile appeared in my project's folder. I opened it with notepad, the file was empty. I recalled that notepad supported only ASCII data. I opened it with WordPad, it was still empty. Finally the little genius inside me urged me to look at the file size and not surprisingly it was 0 bytes. So I rebuilt and reran the program, to no effect. Finally I decided to ask very intelligent people on StackOverflow as to what I am missing and here I am :)

Edited:

After the abovementioned intelligent people left some comments, I decided to follow their advice and rewrote the program like this:

#include <fstream>
#include <iostream>
int main()
{
    std::wofstream fout("myfile");
    if(!fout.is_open())
    {
        std::cout << "Before: Not open...\n";
    }
    fout << L"Հայաստան Россия Österreich Ελλάδα भारत" << std::endl;
    if(!fout.good())
    {
        std::cout << "After: Not good...\n";
    }
}

Built it. Ran it. And... the console clearly read, to my surprise: "After: Not good...". So I edited my post to provide the new information and started waiting for answers which would explain why this is and what I could do. :)

3 Answers

I found the following code working properly. I am using VS2019.

#include <iostream>
#include <fstream>
#include <codecvt>

int main()
{
    std::wstring str = L"abàdëef€hhhhhhhµa";
    std::wofstream fout(L"C:\\app.log.txt", ios_base::app); //change this to ios_base::in or ios_base::out as per relevance
    std::locale loc(std::locale::classic(), new std::codecvt_utf8<wchar_t>);
    fout.imbue(loc);
    fout << str;
    fout.close();
}
Related