2016-12-23 20 views
0

自分の選択に合ったファイルにテキストを書き込む単純なtxtスキャナを作った。問題は、ペンの代わりにファイルに書き込むことです(例:洀漀)。画像上では、例えば見ることができます:ユニコード文字列を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文字列に挿入されたwstringとしてgetlineが動作しないwstringの文字列isteadを意味する場合。そして、コード化に違いがあるはずです。 – 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せずにファイルを用いて試験しました。

最後に改行文字を含むファイルを処理するために最も内側のループを変更する必要がありました。もし私がそれをしなかったら、それは常に真実である空の文字列と一致するでしょう。あなたの代わりにワイド文字の文字を使用する場合

(私も私のコーディングスタイルに応じていくつか他のものを変更した、重要な変更は、トップで1つの右です)

関連する問題