如果有这样的文本文件:
3 size of group
10 individual therapy time(min)
15 group therapy time(min)
25 new client probability percentage
500 individual therapy cost
300 group therapy cost
有没有办法只读取文本行的第一个整数并跳转到其他行?
我尝试过:
settingsFile >> groupSize >> trash >> trash >> trash;
settingsFile >> indTime >> trash >> trash >> trash;
settingsFile >> newClientProb >> trash >> trash >> trash >> trash;
settingsFile >> indTherapyCost >> trash >> trash >> trash;
settingsFile >> groupTherapyCost >> trash >> trash >> trash;
在我看来,这不是阅读文本文件的好方法,因为如果我从文本文件中删除一个trash
字符串,整个阅读将会失败。
答案 0 :(得分:6)
您可以使用std::getline
来忽略其余部分:
settingsFile >> groupSize;
std::getline(settingsFile, trash);
settingsFile >> indTime;
std::getline(settingsFile, trash);
settingsFile >> newClientProb;
std::getline(settingsFile, trash);
settingsFile >> indTherapyCost;
std::getline(settingsFile, trash);
settingsFile >> groupTherapyCost;
std::getline(settingsFile, trash);
另一种方法是逐行读取文件到临时字符串变量,然后利用string_stream
解析该字符串开头的整数,但这有点乏味。
如果C ++ 11可用,可以使用std::stoi
轻松完成第二步,最后得到这样的代码(这次是在循环中):
for (std::string line; std::getline(settingsFile, line); ) {
int value = std::stoi(line);
...
}
或引入新功能readIntLine
:
template< class CharT, class Traits>
int readIntLine(std::basic_istream<CharT,Traits>& input) {
std::basic_string<CharT,Traits> line;
std::getline(settingsFile, line);
return std::stoi(line);
}
然后,它可以这样使用:
groupSize = readIntLine(settingsFile);
indTime = readIntLine(settingsFile);
newClientProb = readIntLine(settingsFile);
indTherapyCost = readIntLine(settingsFile);
groupTherapyCost = readIntLine(settingsFile);
答案 1 :(得分:1)
您可以只读取整数,然后ignore()
读取其余部分:
using NL = std::numeric_limits<std::streamsize>;
while ((in >> value).ignore(NL::max(), '\n')) {
...
}
需要使用max()
,因为此值表示&#34;根据需要添加多个字符&#34;而不是使用一些大的上限。将此逻辑打包为操纵器也是合理的:
std:: istream& ignl(std::istream& in) {
return in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
...
if (in >> value0 >> ignl
&& in >> value1 >> ignl
// ...
) {
// do something with the result
}
当然,在使用输入之前总是需要检查输入:否则在发生故障时将处理随机值。