文件拒绝遍历...继续输出相同的变量内容并重复

时间:2016-07-15 11:07:01

标签: c++ file traversal stdvector

我有一个文件指针的问题。由于某种原因,我无法找到使其遍历并输出document.txt中的每个单词的方法。所有这一切都是输出相同的变量内容,即相同的单词,甚至跳过第一个单词。(因此它会反复输出第二个单词并在遍历后停止)

#include <iterator>
#include <algorithm>
#include <vector>
#include <iostream>
#include <fstream>

using namespace std;

int main()       

{        
    vector<string>  myVector;
    vector<string>::iterator it;

    ifstream docFile("document.txt");

    string inputline;

    getline( docFile, inputline);

    string word;


    while(!docFile.eof())
    { 
            int i = 1;
            docFile >> word;
            myVector.push_back(word);
             cout<<myVector[i]<<endl;
            //  char c = getc(docFile);
            //  if(c == '\n')
            //  ++linecount;
            //  cout<<linecount<<endl;

            ++i;
    }
}

注释代码只是我试图在每次遍历每一行时增加行数。

1 个答案:

答案 0 :(得分:0)

int i = 1;
docFile >> word;
myVector.push_back(word);

最初,myVector为空,push_back()将第一个单词添加到向量中。如您所知,数组索引从0开始,因此第一个单词将进入myVector[0]

cout<<myVector[i]<<endl;

由于i为1,因此会尝试打印myVector[1]而不是myVector[0]。实际上,由于myVector[1]不存在,现在这是未定义的行为,并且可能是崩溃。您声称没有崩溃并继续执行;这仍然属于&#34;未定义的行为&#34;,所以让我们继续。

在循环的下一次迭代中,将执行相同的四行代码。第二个单词现在被push_back()加入myVector[1]。 <{1}}再次初始化为1,i被打印。

在循环的下一次迭代中,将执行相同的四行代码。第三个单词现在被myVector[1]加入push_back()myVector[2]再次被初始化为1,i被打印而不是myVector[1]

在循环的下一次迭代中,将执行相同的四行代码。第四个单词现在被myVector[2]加入push_back()myVector[3]再次被初始化为1,i被打印而不是myVector[1]

等等,等等。在循环的每次迭代中,下一个单词都会添加到向量中,但因为myVector[3]每次都被初始化为1,并且i会显示出来。

循环结束时的

myVector[1]绝对没有任何意义。因为i++在循环内声明,当循环运行到结尾时i被破坏,并且在循环的下一次迭代中,i再次初始化为1。

要修复错误,需要在循环外声明i,并将其初始化为0,而不是1。