2016-10-30 12 views
0

私はファイルを読み込み、この.datファイルの途中にセンチネルを持っています。最初の部分は変数であり、割り当てられる値です。私は変数とその値をうまく取得しています。ここに私が持っているものがあります。eofとセンチネルのinfile

int main() { 
ifstream infile; 
string variable; 
int value; 

infile.open("test.dat"); 

while (infile.peek() != EOF) { 

    infile >> variable; 
    infile >> value; 

} 



return 0; 
} 

、ここで.datファイル

f 32 
h 3 
l -2 
q 3 
v 5 
$ 
lqv 
hfv 
vvf 
vfl 

である私が最初に考えたのはwhileループに使用することです。 while (variable != "$")でしたが、これを行うと無限ループに陥ります。だから私は完全に変数を取得し、割り当てる方法については失われ、残りの.datファイルを取得します。

私は変数をハードコードしたくないという事実のためにこれを少し変更しなければなりませんでした。私は2つのループを使用します。 $の前に1つ、$の後に1つ。私が試みるとwhile (infile != "$")私は無限ループを取得します。

答えて

0

あなたは無限ループを避ける必要があります

while (infile.good()) { 
    infile >> variable; 
    if (variable != "$" && variable.length() > 0) { 
     infile >> value; 
     switch (variable[0]) { 
      ... 
     } 
    } 
    else 
     break; 
} 

これにより

while (infile.peek() != EOF) { 
    infile >> variable; 
    infile >> value; 
    ... 
} 

を置き換えることができます。

1

私は次のことを提案し、必要に応じて値を読んで最初の変数名に読んで:

std::map<std::string, double> dictionary; 
while (infile >> variable) 
{ 
    if (variable != "$") 
    { 
    infile >> value; 
    dictionary[variable] = value; 
    } 
    else 
    { 
    break; 
    } 
} 

while (infile >> variable) 
{ 
    if (variable != "$") 
    { 
    infile >> value; 
    } 
    else 
    { 
    break; 
    } 
} 

std::mapは値に変数名を関連付けるするのに非常に有用です構文infile >> variableは、ファイルから読み込むための信頼性の高い方法です。

0

次の文字が '$'かEOFかどうかを確認できますが、「>>」の後に\ nのgetを追加する必要があります。

これは、実際にファイルの構造がわかっている場合にのみ有効です。そうでない場合は、行を読み込んで必要なものをスキャンする必要があります。