c ++ while(getline(file,str))不起作用

时间:2014-10-29 20:44:41

标签: c++ file-io vector getline

我试图从文件中读取填充2d向量(向量的向量)。

void readFromFile()
    {
        string str;
        ifstream fileToOpen("test.txt");
        if (fileToOpen.is_open())
        {
            resetBoard();
            height=count(istreambuf_iterator<char>(fileToOpen),istreambuf_iterator<char>(), '\n');
            length=height*2-1;
            cout<<board.size()<<endl;
            while(getline(fileToOpen,str))
            {
                cout<<"inside while\n";
                stringstream ss(str);
                int i;
                vector<short unsigned> line;
                while (ss>>i)
                {
                    line.push_back(i);
                }
                board.push_back(line);
            }
            fileToOpen.close();
            //board.shrink_to_fit();
        }
        else
            cout<<"Unable to open file!\n";
        print();

    }

您可以忽略大多数与实际文件打开和读取/写入向量无关的代码。问题是第一次,而循环似乎没有执行

    while(getline(fileToOpen,str))
    {
        cout<<"inside while\n";

cout语句永远不会触发,我只是无法弄清楚为什么会发生这种情况,我尝试使用全新的矢量,而不是使用我在课堂上的一个,不同的打印方法等等,直到我发现它从未实际到达那一点

我的文字文件

0000000000000001000000000000000
0000000000000011100000000000000
0000000000000110010000000000000
0000000000001101111000000000000
0000000000011001000100000000000
0000000000110111101110000000000
0000000001100100001001000000000
0000000011011110011111100000000
0000000110010001110000010000000
0000001101111011001000111000000
0000011001000010111101100100000
0000110111100110100001011110000
0001100100011100110011010001000
0011011110110011101110011011100
0110010000101110001001110010010
1101111001101001011111001111111

2 个答案:

答案 0 :(得分:3)

height=count(istreambuf_iterator<char>(fileToOpen),istreambuf_iterator<char>(), '\n');

这耗尽了整个文件。所以在那之后,没有更多的线要阅读。很明显,调用getline或任何其他输入函数都会失败。

您可以清除流中的错误并将其重置为开头,但为什么您首先需要该行?只需在使用getline阅读时计算行数。或者只是在阅读完之后从board.size()获取它(这里我假设board是标准序列容器,并且事先是空的。)

答案 1 :(得分:2)

在height = count(...)行之后,它处于eof。

在while(getline)之前添加:

fileToOpen.seekg(0, fileToOpen.beg);