1,1,1,1,1,1 などのデータ行を含むテキスト ファイルを解析するための次のコードがあります。
while(file >> line)
{
words.push_back(line);
}
for(int i = 0; i < words.size(); i++)
{
if(words.at(i).substr(0, 1) == "[" && words.at(i) != "[header]")
layers.push_back(words.at(i));
if(words.at(i).substr(0, 4) == "type")
{
temp = words.at(i);
temp.substr(4, 1);
types.push_back(temp);
}
if(words.at(i) == "[header]")
{
map_width = words.at(i+1).substr(6, words.at(i+1).size());
map_height = words.at(i+2).substr(7, words.at(i+1).size());
stringstream(map_width) >> width;
stringstream(map_height) >> height;
}
if(words.at(i) == "type=background")
{
for(int j = i+1; j <= height + (i+1); j++)
{
int l = 0, m = 1, number = 0, extracted;
string extracted_line = words.at(j);
for(int k = 0; k <= extracted_line.size(); k++)
{
cout << number << endl;
string ph_character = words.at(j).substr(l, m);
if(ph_character == ",")
{
number = 0;
break;
}
if(ph_character == "0") cout << "Found 0.\n";
stringstream(ph_character) >> extracted;
number = (number*10) + extracted;
switch(number)
{
case 1:
//cout << "Found 1" << endl;
break;
case 4:
cout << "Found 4" << endl;
break;
}
l++; m++;
}
}
}
}
file.close();
}
上記のコードは、ファイルを反復処理し、各行を文字列配列に格納し、各行を文字列に格納してから、文字列の各文字をチェックすることになっています。数値は「,」文字に遭遇するたびにリセットする必要がありますが、出力はクレイジーです:
0
1
11
111
1111
11111
111111
1111111
11111111
111111111
1111111111
-1773790777
-558038505
and so on.
私は何を間違えましたか?出力はファイルの正確な内容である必要があり、通常は 1、1、1、10 の順で、基本的には「,」の前の数字です。code::blocks を使用して Windows XP SP3 を実行しています。
編集:
解析しようとしているファイルのサンプル:
> 1,1,1,1,1,2,23,23,23,23,23,1,1,1,1,1,1,1,1,1
> 10,10,10,23,1,1,1,1,1,1,1,1,23,23,23,23,1,1,1
そのようなデータの行は他にもありますが、この質問をさらにあふれさせる意味はありません。