是否可以从输入流中“丢弃”读取值?

Posted

技术标签:

【中文标题】是否可以从输入流中“丢弃”读取值?【英文标题】:Is it possible to 'throw away' read value from input stream? 【发布时间】:2017-04-24 00:51:51 【问题描述】:

我使用列中的数据处理一些数据,例如,

1 -0.004002415458937208 0.0035676328502415523
2 -0.004002415796209478 0.0035676331876702957
....

我只对最后两个值感兴趣。我通常发现将值读取为:

std::ifstream file(file_name);
double a, b;
for (lines) 
    //      | throwing away the first value by reading it to `a`
    file >> a >> a >> b;
    store(a, b);

我不确定这对其他人的可读性如何,当数据结构未知时,它可能被认为是错误。 我能否以某种方式让它看起来更明确,我真的想丢弃第一个读取值?

我想要这行中的一些东西,但没有任何效果:

file >> double() >> a >> b; // I hoped I could create some r-value kind of thing and discard the data in there
file >> NULL >> a >> b;

【问题讨论】:

_ 是一个有效的标识符,我之前已经看到它被用于具有未使用内容的变量。其他名称:discardedignoredconsumedunuseddestroyer_of_hope(好吧,不是最后一个) 我命名了一个名为eater的变量,它会吃掉不需要的输入。 我在想为它创建一个变量是多余的,之后不使用它会产生一个警告(我意识到它没有)。这可能是一个不错的解决方法。 如果你从文件中读取,为什么你说“来自 std::cin”? file >> junk >>... 会工作。这就是我丢弃输入的方法。 【参考方案1】:

您可以使用std::istream::ignore

例如:

file.ignore(std::numeric_limits<std::streamsize>::max(), ' '); //columns are separated with space so passing it as the delimiter.
file >> a >> b;

【讨论】:

好答案。然而,我觉得它有点冗长,而且它违背了短 file &gt;&gt; a &gt;&gt; a &gt;&gt; b; 的目的。 @pingul 好吧,您可以创建一个自定义流操纵器以使语法更漂亮。看看这个答案。它应该很容易满足您的需求:***.com/a/29414164/2355119【参考方案2】:

您可以使用 file::ignore(255, ' ') 忽略字符,直到下一个空格。

std::ifstream file(file_name);
double a, b;
for (lines) 
    //  skip first value until space
    file.ignore(255, ' ');
    file >> a >> b;
    store(a, b);

或者您可以使用辅助变量来存储第一个值:

std::ifstream file(file_name);
double aux, a, b;
for (lines) 
    //  skip first value
    file >> aux >> a >> b;
    store(a, b);

【讨论】:

file.ignore() 应该使用std::numeric_limits&lt;std::streamsize&gt;::max() 忽略所有字符,直到下一个空格。使用 255 人为地限制您最多忽略 255 个字符。 我认为这不是问题,因为第一个数据是整数。问题可能是该行是否以 1 个或多个空格开头。在这种情况下,代码不能按需要工作!!【参考方案3】:

如果您不想显式创建要忽略的变量,并且您觉得显式忽略该值并调用操作流过于冗长,您可以利用 operator&gt;&gt;std::istream 重载接受std::istream&amp;(*)(std::istream&amp;) 函数指针:

template <typename CharT>
std::basic_istream<CharT>& ignore(std::basic_istream<CharT>& in)
    std::string ignoredValue;
    return in >> ignoredValue;

使用如下:

std::cin >> ignore >> a >> b;

如果你想验证它是一种可以读入类型的形式,你可以提供一个额外的模板参数来指定被忽略值的类型:

// default arguments to allow use of ignore without explicit type
template <typename T = std::string, typename CharT = char>
std::basic_istream<CharT>& ignore(std::basic_istream<CharT>& in)
    T ignoredValue;
    return in >> ignoredValue;

使用如下:

std::cin >> ignore >> a >> b;
// and
std::cin >> ignore<int> >> a >> b;

demo on coliru

【讨论】:

以上是关于是否可以从输入流中“丢弃”读取值?的主要内容,如果未能解决你的问题,请参考以下文章

丢弃来自套接字的输入

Io流中的其他流

从输入流中读取格式化文本[重复]

Android有效地从输入流中读取

字符输入流读取文本文件ReaderFileReaderBufferedReader

字符输入流读取文本文件ReaderFileReaderBufferedReader