【问题标题】:Istringstream doesn't "walk" through the lineIstringstream 不会“走”过这条线
【发布时间】:2012-10-12 09:00:13
【问题描述】:

我正在尝试通过以下方式读取存储特征向量的特征向量文件:

(label) (bin):(value) (bin):(value) 等

喜欢:

-1 5:0.015748 6:0.0472441 7:0.0393701 8:0.00787402 12:0.0314961 13:0.0944882 14:0.110236 15:0.0472441 20:0.023622 21:0.102362 22:0.110236 28:0.015748 29:0.228346 30:0.125984 P >

如您所见,它保存时没有包含值为 0 的 bin。

我尝试使用以下代码阅读它们:

int bin;
int label;
float value;
string small_char; -> change to char small_char to fix the problem

if(readFile.is_open())
  while(!readFile.eof()) {
    getline(readFile, line);
    istringstream stm(line);
    stm >> label;
    cout << label << endl;
    while(stm) {
          stm >> bin;
          stm >> small_char;
          stm >> value;
          cout << bin << small_char << value << endl;
    }
    cout << "Press ENTER to continue...";
    cin.ignore( numeric_limits<streamsize>::max(), '\n' );
  } 
}

但由于未知原因,标签被正确读取,第一个带有值的 bin 也是如此,但以下 bin 根本没有被读取。

上面示例行的输出是:

-1
5:0.015748
5:0.015748
Press ENTER to continue

后面的所有行都会发生同样的事情。

我正在使用 Visual Studio 10,如果这很重要的话。

【问题讨论】:

  • 一件事(尽管与您的问题无关)是您不应该使用while (readFile.eof())(或其他状态函数)。而是使用while (getline(readFile, line))
  • 顺便说一句,您能否编辑您的问题以包含labelbinsmall_charvalue 的声明。
  • @JoachimPileborg getline 在文件中,而不是在 cin 上。他只是在阅读cin 以暂停。
  • 没有看到变量声明,是不可能的。但顺便说一句,我会说在读取第二个垃圾箱时存在某种错误。您在没有检查您是否实际阅读过它们的情况下输出元素,因此最后一次成功的输入将被输出两次。你的嵌套循环应该是while ( stm &gt;&gt; bin &gt;&gt; small_char &gt;&gt; value )。当然,你的外循环应该是while ( getline( readFile, line )

标签: c++ visual-studio-2010 stringstream istringstream


【解决方案1】:

自己测试过,您似乎没有使用正确的类型(以及正确的循环条件)。

我的测试程序:

#include <sstream>
#include <iostream>

int main()
{
    std::istringstream is("-1 5:0.015748 6:0.0472441 7:0.0393701 8:0.00787402 12:0.0314961 13:0.0944882 14:0.110236 15:0.0472441 20:0.023622 21:0.102362 22:0.110236 28:0.015748 29:0.228346 30:0.125984");

    int label;
    int bin;
    char small;
    double value;

    is >> label;
    std::cout << label << '\n';
    while (is >> bin >> small >> value)
    {
        std::cout << bin << small << value << '\n';
    }
}

这个程序的输出是:

-1 5:0.015748 6:0.0472441 7:0.0393701 8:0.00787402 12:0.0314961 13:0.0944882 14:0.110236 15:0.0472441 20:0.023622 21:0.102362 22:0.110236 28:0.015748 29:0.228346 30:0.125984

因此,请确保变量类型正确,并更改循环以不获取双尾行。

【讨论】:

  • 我使用字符串作为 small_char 的变量类型,我猜这就是发生错误的地方。问题解决了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多