文字列から整数値を解析する方法はいくつかあります。
まずは、あなたのループを修正してみましょう。ここでは
int pos = 0;
while(std::getline(in, line) && pos < 100)
{
int value = 0;
// Insert chosen parsing method here
arr[pos++] = value;
}
は、一般的なオプションの非網羅的なリストである:
使用std::strtol
// Will return 0 on error (indistinguishable from parsing actual 0)
value = std::strtol(line.c_str(), nullptr, 10 );
使用std::stoi
// Will throw exception on error
value = std::stoi(line);
std::istringstream
を構築し、そこから読み:
std::istringstream iss(line);
iss >> value;
if(!iss) {
// Failed to parse value.
}
使用std::sscanf
今
if(1 != std::sscanf(line.c_str(), "%d", &value))
{
// Failed to parse value.
}
、pos < 100
をチェックするループに境界テストの点に注意してください。これは、配列にストレージの制限があるためです。実際には、グローバルなものもRead_Save
にローカルなものでオーバーライドしています。したがって、関数の終了時に失われる小さな配列で隠してしまいます。
標準ライブラリが提供する他のコンテナタイプを使用して、任意のサイズの「配列」(実際には配列ではありません)を持つことができます。ランダムアクセスを提供する有用なものは、std::vector
およびstd::deque
です。
std::vector<int> Read_Save(std::istream & in)
{
std::vector<int> values;
std::string line;
for(int line_number = 1; getline(in, line); line_number++)
{
try {
int value = std::stoi(line);
values.push_back(value);
}
catch(std::bad_alloc & e)
{
std::cerr << "Error (line " << line_number << "): Out of memory!" << std::endl;
throw e;
}
catch(std::exception & e)
{
std::cerr << "Error (line " << line_number << "): " << e.what() << std::endl;
}
}
return values;
}
そして最後に、呼び出しは次のようになります:のは、ベクターを使用して、もう少し有用であることがRead_Save
の定義を変更してみましょう
std::ifstream in("file.txt");
std::vector<int> values = Read_Save(in);
あなたはstrcpy' – Raindrop7
'と入力する整数の配列を'ながら(!in.peek()= EOF) '動作しますができませんが、とEOFトラップを読む前にEOFのテストに陥っていないといいですが、 'while(getline(in、line、 '\ n'))'は 'peek'を保存し、ただEOF。 – user4581301