我在从文件中读取输入时遇到了一些麻烦,而我实际上不应该在作业中进行输入。我在以前的先前分配中使用了非常相似的代码(唯一改变的地方是值被推到哪里)。我得到了一个带有以下输入的文本文件:

10
3 6 4 9 0 7 8
8 5 3 7 3 4 -2
5 10 2 8 1 4 1
2 6 -3 1 3 7 1
1 10 -1 2 2 4 -2
10 9 -3 1 3 7 2 5 1
7 3 0 10 1 2 1 8 2
9 6 6 3 4 10 7
4 8 5 1 9 5 6
6 2 4 3 0 9 0

第一行是上图显示的顶点数。在其后的每一行上,第一个数字是该顶点用于哪个顶点,下一个数字是其连接到哪个顶点,而后一个是该边的权重。该线重复顶点,权重直到线的末端(即,第一条线用于顶点3,它的权重为4的边到6,权重为0的边到9,等等)。我正在使用1d vector 来表示使用行主要表示法的矩阵。我遇到的问题是我的行变量似乎根本没有更新。当前,我从while循环的最后一行中获得以下输出,该输出实际上将数据插入 vector 中。
3:  6: 4
3:  9: 0
3:  7: 8
3:  8: 5
3:  3: 7
3:  3: 4
3:  -2: 5
3:  10: 2
3:  8: 1
3:  4: 1
3:  2: 6
3:  -3: 1
3:  3: 7
3:  1: 1
3:  10: -1
3:  2: 2
3:  4: -2
3:  10: 9
3:  -3: 1
3:  3: 7
3:  2: 5
3:  1: 7
3:  3: 0
3:  10: 1
3:  2: 1
3:  8: 2
3:  9: 6
3:  6: 3
3:  4: 10
3:  7: 4
3:  8: 5
3:  1: 9
3:  5: 6
3:  6: 2
3:  4: 3
3:  0: 9
3:  0: 9

我的行变量似乎卡住了3,就像input.peek()一样,因为while循环的条件是永远看不到换行符。真正令人困惑的部分是,在类似的分配中,这部分代码可以很好地遍历输入文件,并填充应该去的地方。我很沮丧,所以如果有人能指出正确的方向,我将非常感激。如果我太冗长,我事先表示歉意。

我的代码如下。
if(input.is_open()) // making sure the input is open
{
    input >> nodeCount; //Grabbing the number of nodes from the first value of the file

    for(int i = 1; i < nodeCount*nodeCount; i++)
    {
        edgeList.push_back(graphNode());
        edgeList[i].value = infinity;
        edgeList[i].isInfinity = true;
        edgeList[i].pred = -1;
    }

    //Putting data from the file into the vector array
    while(!input.eof())
    {
        input >> row; //For each cycle through the list, we grab the first number on the line to get which x value (start vertex) we're working with
        while(input.peek() != '\n' && !input.eof())
        {
            input >> col;
            input >> edgeList[((row-1)*nodeCount)+(col-1)].value;
            edgeList[((row-1)*nodeCount)+(col-1)].isInfinity = false;
            edgeList[((row-1)*nodeCount)+(col-1)].pred = row;
            cout << row << ": " << " " << col << ": " << edgeList[((row-1)*nodeCount)+(col-1)].value << endl;
        }

    }
    input.close(); //Closing our input file since we don't need it anymore
}

最佳答案

通过查看您吐出的数字,很明显,在文件结束之前,这种情况永远不会评估为false:
input.peek() != '\n' && !input.eof()
我对您的问题是-您使用的是Windows样式,Unix样式还是Mac样式的行尾?也许有一种更好的方法来确定行的结束位置,而不依赖于假设它们采用某个ASCII值?

关于c++ - C++ peek()没有看到换行符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16028775/

10-12 20:37