Записать строки Unicode в текстовый файл

Я сделал свой простой текстовый сканер, который записывает текст в файл, который соответствует моему выбору. Проблема заключается в записи в файл, когда вместо ручки пишет, например, 洀漀. На картинке вы можете увидеть, например:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
int offset;
wstring DBSearchLine, ScanLine;

wifstream ScanFile, DBSearchFile;
wofstream ResultFile;
ScanFile.open("ScanFile.txt", ios_base::binary);
ResultFile.open("ResultFile.txt", ios::out, ios_base::binary);

if (ScanFile.is_open())
{
    while (!ScanFile.eof())
    {
        DBSearchFile.open("DBSearchFile.txt", ios_base::binary);
        if (!DBSearchFile.is_open())
        {
            cout << "Error open DBSearchFile.txt" << "\n";
            break;
        }

        getline(ScanFile, ScanLine);
        wcout << "Scan line is - " << ScanLine << "\n";

        while (!DBSearchFile.eof())
        {
            getline(DBSearchFile, DBSearchLine);
            wcout << "DBSearchLine is -" << DBSearchLine << "\n";
            if ((offset = ScanLine.find(DBSearchLine, 0)) != string::npos)
            {
                ResultFile << ScanLine << L"\n";
            }
        }
        DBSearchFile.close();
    }
    ScanFile.close();
}
else
{
    cout << "Error open ScanFile.txt" << "\n";
}
system("PAUSE");
return 0;
}

1 ответ

#include <iostream>
#include <fstream>
#include <string>
#include <locale>
#include <codecvt>

using namespace std;

int main()
{
    /* via http://stackru.com/a/5105192/4005233 
       changes the encoding of the console and all subsequently opened 
       files */
    std::locale::global(std::locale(""));

    wifstream ScanFile;
    ScanFile.open("ScanFile.txt", ios_base::binary);
    if (!ScanFile.is_open()) {
        cout << "Error open ScanFile.txt" << "\n";
        return 1;
    }

    wofstream ResultFile("ResultFile.txt", ios::out);

    while (!ScanFile.eof())
    {
        wifstream DBSearchFile;
        DBSearchFile.open("DBSearchFile.txt", ios_base::binary);
        if (!DBSearchFile.is_open())
        {
            cout << "Error open DBSearchFile.txt" << "\n";
            break;
        }

        wstring ScanLine;
        getline(ScanFile, ScanLine);
        wcout << "Scan line is - " << ScanLine << "\n";

        do
        {
            wstring DBSearchLine; 
            getline(DBSearchFile, DBSearchLine);
            // have all lines been read?
            if(!DBSearchLine.length())
                break;
            wcout << "DBSearchLine is -" << DBSearchLine << "\n";

            if (ScanLine.find(DBSearchLine, 0) != string::npos)
            {
                ResultFile << ScanLine << L"\n";
                break; // found a match, no need to search further
            }
        }while(1);
        DBSearchFile.close();
    }

    ScanFile.close();

    return 0;
}

Это было проверено с использованием файлов с и без спецификации.

Внутренний цикл должен был быть изменен для обработки файлов с символом новой строки в конце; если бы я не сделал этого, он бы совпадал с пустой строкой, которая всегда верна.

(Я также изменил несколько других вещей в соответствии со своим стилем кодирования, главное изменение - это то, что вверху)

Другие вопросы по тегам