只读取文本文件中整行的第一个整数

时间:2015-05-24 13:41:15

标签: c++ file-io

如果有这样的文本文件:

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字符串,整个阅读将会失败。

2 个答案:

答案 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
}

当然,在使用输入之前总是需要检查输入:否则在发生故障时将处理随机值。