2010-11-18 15 views
0

iniファイル: アドレス=「localhost」を ユーザ名=「ルート」 パスワード=「あなたのパスワード」 データベース=「yourdatabasenameは」ifstreamとの間で単語を読む方法は?含ま

と私ははifstreamで「」二つの間の単語を見つける必要があり、それをチャーに入れてください。

これを行う方法はありますか?

+0

されていますそれぞれのキーの間に改行がありますか? – Simone

+0

はいそれの間に行があります – Marcus

+0

これは、 'char'ではなく' char * 'を意味していると思います。これがインターフェース要件でない限り、' std: :string' –

答えて

0

各カップルの間に改行がある場合は、次の操作を行うことができます。

std::string line; //string holding the result 
char charString[256]; // C-string 

while(getline(fs,line)){ //while there are lines, loop, fs is your ifstream 
    for(int i =0; i< line.length(); i++) { 
     if(line[i] != '"') continue; //seach until the first " is found 

     int index = 0; 
     for(int j= i+1; line[j] != '"'; j++) { 
      charString[index++] = line[j]; 
     } 
     charString[index] = '\0'; //c-string, must be null terminated 

     //do something with the result 
     std::cout << "Result : " << charString << std::endl; 

     break; // exit the for loop, next string 
    } 
} 
+0

Thx、しかし私はこれをプログラムする方法がわかりません。 – Marcus

0

次のように私はそれに近づくでしょう:

  • 名前と値のペアを表すクラスを作成して使用std::istream& operator>>(std::istream &, NameValuePair &);

そのあとのようなもの行うことができます。

ifstream inifile(fileName); 
NameValuePair myPair; 
while(ifstream >> myPair) 
{ 
    myConfigMap.insert(myPair.asStdPair()); 
} 

iniファイルに名前付き値のペアが含まれているセクションが含まれている場合は、セクションの最後まで読み込む必要がありますので、ロジックでストリーム障害が発生することはありません。 (あなたは何かを読んで、それがあなたの状態を決定するものを決定する)。

あなたの名前と値のペアに読み込まれたストリームを実装するのは、引用符をターミネーターとして使用してgetlineで行うことができます。

std::istream& operator>>(std::istream& is, NameValuePair & nvPair) 
{ 
    std::string line; 
    if(std::getline(is, line, '\"')) 
    { 
    // we have token up to first quote. Strip off the = at the end plus any whitespace before it 
    std::string name = parseKey(line); 
    if(std::getline(is, line, '\"')) // read to the next quote. 
    { 
     // no need to parse line it will already be value unless you allow escape sequences 
     nvPair.name = name; 
     nvPair.value = line; 
    } 
    } 
    return is; 
} 

トークンを完全に解析するまで、私はnvPair.nameに書き込まなかったことに注意してください。ストリーミングが失敗した場合、我々は部分的に書きたいとは思わない。

いずれかのgetlineが失敗した場合、ストリームは失敗状態のままになります。これは、ファイルの終わりに自然に発生します。その理由で失敗した場合は例外をスローしたくないのは、ファイルの終わりを処理する方法が間違っているからです。名前と値の間で失敗した場合、または名前に末尾の=記号(空ではない)がない場合は、それは自然発生ではないため投げることができます。

これは、引用符の間にスペースや改行を入れることができます。それらの間にあるものは、別の引用符以外のものが読み込まれます。これらを許可するには、エスケープシーケンスを使用する必要があります(そして、値を解析する)。

あなたは\を使用した場合はループ 『」エスケープシーケンスとして、あなたがしなければならない値を取得するときに、』それは、\(だけでなく、引用符に変更する)で終了した場合、それらを一緒に連結する。

関連する問題