有幾種方法可以從字符串中解析出整數值。
首先,讓我們來解決你的循環:
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
。讓我們用向量和改變Read_Save
的定義是有點更加有用:
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;
}
最後,該呼叫將變爲:
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