while循环后如何继续阅读?

时间:2018-11-04 18:43:27

标签: c++ filestream

我有一个.txt文件,在第一行上有一个数字和空格序列,希望将其读入向量。然后在下一行有一个“ $”符号。在此之后的另一行是另一行,其中包含我想读入另一个向量的数字和空格序列(如第一个)。例如

1 2 3 4 5
$
4 3 2 1 6

我已经尝试了所有方法,但是在最初的while循环读取整数后无法继续读取。我如何越过第二行并阅读第三行?现在,它仅输出第一行。目前,这是我的代码:

int main(int argc, const char * argv[]) {
    ifstream file(argv[1]); 
    if (file.is_open() && file.good()){
        int addMe;
        vector<int> addMeList;
        while(file>>addMe){
            cout <<addMe<<endl;
            addMeList.push_back(addMe);
        }

        string skip;
        while(file >> skip)
            cout << skip << endl;

        int searchQuery;
        vector<int> searchQueries;

        while(file>>searchQuery){
            searchQueries.push_back(searchQuery);
        }

        for (int i=0; i<searchQueries.size();i++)
        {
            cout << searchQueries[i]<<endl;
        }
    }
    return 0;

}

2 个答案:

答案 0 :(得分:2)

两个问题:

  1. 第一个循环将导致设置流failbit(当它尝试从第二行读取'$'时)。如果该位置1,则无法从流中读取更多内容。你需要 来clear流状态。

  2. 完成上述操作后,第二个循环将读取文件的其余部分。

一种可能的解决方案是改为读取。使用例如std::getline读取一行。将行放入std::istringstream中,并从中读取值。

答案 1 :(得分:0)

程序逻辑似乎有缺陷。使用 first while循环,逐字读取 entire 文件,直到最后(不是到行尾),然后尝试再次读取失败,其评估为false,因此它甚至从未进入其他循环。相反,可以考虑使用getline逐行读取,然后使用int将其分成istringstream s。
这是我要改进的方法:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>                  // include this header to use istringstream
using namespace std;

int main() {
    ifstream file("text.txt");      // my test file; Replace with yours 
    if (file.is_open() && file.good()) {

        string lineIn;              // general line to read into
        int i;                      // general int to read into
        vector<int> addMeList;
        // int addMe;               // not needed anymore
        getline(file, lineIn);      // read a line 1
        istringstream istr(lineIn); // string stream we can use to read integers from
        while (istr >> i) {
            cout << i << endl;
            addMeList.push_back(i);
        }


        // string skip;              // not needed anymore 

        getline(file, lineIn);       // skips line 2

        // int searchQuery;          // not needed anymore
        vector<int> searchQueries;

        getline(file, lineIn);       // read a line 2
        istringstream istr2(lineIn); // string stream we can use to read integers from
        while (istr2 >> i) {
            searchQueries.push_back(i);
        }

        for (int i = 0; i < searchQueries.size(); i++)
        {
            cout << searchQueries[i] << endl;
        }
    }
    return 0;
}

输入文件:

1 2 3 4 5
$
4 3 2 1 6

输出:

1
2
3
4
5
4
3
2
1
6