2016-05-02 19 views
0

ファイルから書式付き行を読み込み、解析して結果をファイルに出力する必要があります。私が抱えている問題は、入力を適切に解析して空白とコンマを処理することです。ファイル内の行の形式は、次のようになります。空白とコンマに基づいて入力文字列を分割する

a r3, r2, r1 
ah r8, r5, r6, r7 
ai r10, i10, r127 

したがって、行に4〜5種類の要素がある可能性があります。最初の要素は "コマンド"、その後は空白、そしてコンマと空白で区切られた値です。

私の現在の実装は以下の通りです:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <bitset> 
using namespace std; 

void main() 
{ 
    string instruction; 
    vector<string> myString; 
    ifstream inFile; 
    inFile.open("myfile.txt"); 
    int i = 0; 


    if (inFile.is_open()){ 
     cout << "test" << endl; 
     //Read until no more lines in text file to read 
     //while (getline(inFile, instruction)) 
     while (inFile >> instruction) 
     { 

      istringstream ss(instruction); 
      string token; 
      //Separate string based on commas and white spaces 
      while (getline(ss, token,',')){ 
       //getline(token, token, ' '); 

       //Push each token to the vector 
       myString.push_back(token); 
       cout << myString[i] << endl; 
       i++; 
      } 

     } 
    } 
    system("pause"); 
} 

しかし、これは動作しません。私がa r3, r2, r1でテストすると、私はaしか得られず、プログラムは空白を見ているので読み込みを中止します。

私が試した他のバージョンがwhile (getline(inFile, instruction))へのファイルの読み込みを変更することですが、その後、これは私の中に文字列を分割します。

a r3 
r1 
r2 

それは(スペース)R3は一つの要素であると考えています。コンマに基づいて、行全体を正しく分割していますが、最初の読みは間違っています。なぜなら、aとr3を分割する必要があるからです。これどうやってするの?ここで

+0

'operator >>'は、スペースで区切られたトークンを読み取ります。したがって、スペースをスキップしてstd :: stringがすべての文字を次のスペース(または改行)文字まで読み込みます。 –

答えて

4

これは仕事を行います。

if (inFile.is_open()){ 
    cout << "test" << endl; 
    //Read until no more lines in text file to read 
    while (getline(inFile, instruction)) 
    { 

     istringstream ss(instruction); 
     string token; 
     //Separate string based on commas and white spaces 
     getline(ss,token,' '); 
     myString.push_back(token); 
     cout << myString[i] << endl; 
     i++; 

     while (getline(ss, token,',')){ 
      ss.ignore(); 
      myString.push_back(token); 
      cout << myString[i] << endl; 
      i++; 
     } 

    } 
} 

ポイント:
getline(inFile,instruction)は、ストリーム内の文字を無視するように、あなたに
getline(ss,token,' ')
getline(ss,token,',')が最終的にコンマ
ss.ignore()まで読み込み、空白まで読み込む行全体を取得します。

ストリームの終わりに達すると、getlineが停止することが重要です。


inFile>>instructionは、デフォルトで空白まで読み取ります。行全体を読み込むには、代わりにgetlineを使用する必要があります。

+0

最後のカンマの後に最後のビットが表示されますか? – xaxxon

+0

@Rishit結果はr3 1 2になります。したがって、r1とr2からrを削除しました。なぜr3からrを削除しないのですか? – Noobgineer

+0

気にしないでください。ファイルの書式設定に間違いがありました。 – Noobgineer

-1

あなたが行く:str内の任意の文字のための

http://en.cppreference.com/w/cpp/string/basic_string/find_first_of

size_t find_first_of(const basic_string& str, size_type pos = 0)

検索を...

#include <iostream> 
#include <string> 
using namespace std; 
int main() 
{ 
    string s = "this is some, text"; 
    size_t position = -1; 
    do { 
     position = s.find_first_of(" ,", position+1); 
    } while(position != std::string::npos); 

} 
+0

私は特定の文字列を見つけるまで何回も検索しなければならない回数を返すので、これが私の問題にどのように役立つかは分かりません。私は特定のコンテンツとは対照的に、フォーマットの前提でこれを行う必要があります。私は、どんな文字/文字列か分かりませんが、私はその形式しか知りません。 – Noobgineer

+0

私は少し間違って読みました...その場合、最初のスペースを検索し、最初のスペースの場所の後にコンマで区切ります。それはちょうど2つの部分が必要です。 std :: string :: findはそのために便利です。 – xaxxon

関連する問題