2016-12-23 4 views
0

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

enter image description here

#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; 
} 
+0

ли работа, если вы используете символ вместо широкого полукокса? – ZDF

+0

@ZDF Если вы имеете в виду строку istead wstring, которая не работает getline, потому что в качестве вставленной wstring в строку. И должна быть разница в кодировании – Marek

+0

'ResultFile.open (« ResultFile.txt », ios :: out, ios_base :: binary)' - не должно быть 'ios :: out | ios_base :: binary'? Кроме того, невозможно воспроизвести - clang 3.9.0, Ubuntu 14.04.05 x86_64. –

ответ

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

using namespace std; 

int main() 
{ 
    /* via http://stackoverflow.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; 
} 

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^