在循环中使用getline,存储到数组

时间:2016-05-04 18:09:19

标签: c++

使用getline来存储信息,我希望有一个数组,它使用'/'作为分隔符在文本文件中存储整个列,但是当创建一个循环通过第一行并存储在a[i]等中,然后进入下一行。

const int MAX = 20;
int main(){

    string menuname;
    string a[MAX];
    string d[MAX];
    string b[MAX];
    string c[MAX];
    string line;
    bool error = false;
    ifstream openFile;
    int counter = 0;

    do{
        cout  << "Please enter the name of the menu you would like to open: ";
        cin >> menuname;
        menuname +=  ".txt";
        openFile.open(menuname.c_str());
        if(openFile.fail()){
            cerr << "Unable to open file, please re-enter the name.\n";
            error = true;
        }
    //Determine how many lines long the text file is
        while(getline(openFile, line)){
            ++counter;
        }
       //Testing the counter
    cout << counter;
    }while(error == true);

    while(! openFile.eof()){
         for(int i = 0; i < counter; i++){
            getline( openFile, a[i], '/');
            getline( openFile, b[i], '/');
            getline( openFile, c[i], '/');
            getline( openFile, d[i]);
        }
    }
    for(int i = 0; i < counter; i++){
        cout << a[i] << b[i];
    }
}

当我运行程序时,目前没有错误,我通过显示一个正常工作的输出测试了计数器变量,但是在程序的底部我创建了一个小测试,应该打印一些2我存储的数组,但它没有打印任何东西,程序只是在显示计数器的值后结束。

1 个答案:

答案 0 :(得分:3)

问题是当你去实际存储数据时,你就在文件的末尾。

while(! openFile.eof()){
     for(int i = 0; i < counter; i++){
        getline( openFile, a[i], '/');
        getline( openFile, b[i], '/');
        getline( openFile, c[i], '/');
        getline( openFile, d[i]);
    }
}

将文件一直读到最后,然后在字符串上设置EOF标志。然后你到了

while(getline( openFile, a[counter], '/') && getline( openFile, b[counter], '/') &&
      getline( openFile, c[counter], '/') && getline( openFile, d[counter])){
    counter++;
}

由于设置了EOF标志,因此永远不会执行while循环。因为所有你真正需要的计数器是最后的显示循环,我们可以将计数器循环和读取循环组合成一个循环,如

if ("Vani".equals(fName)) {
    // you go in
} else {
    // cannot go in
}

现在我们读完整个文件,并计算读取的行数。