Istringstream不会“走”出这条线

时间:2012-10-12 09:00:14

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

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

  

(标签)(bin):(值)(bin):(值)等。

像:

  

-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

正如你所看到的那样,它的保存时没有值为0的箱子。

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

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,无论如何这都很重要。

1 个答案:

答案 0 :(得分:0)

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

我的测试程序:

#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

因此,请确保变量类型正确,并将循环更改为不会获得双重最后一行。