Как продолжить чтение после цикла while? - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть файл .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 голосов
/ 04 ноября 2018

Логика программы кажется некорректной. Используя цикл first while, вы дословно читаете файл весь файл до самого конца (не до конца строки), после чего попытка повторного чтения завершается неудачно, который оценивается как false, таким образом, он даже не попадает в другие циклы. Вместо этого рассмотрите чтение построчно, используя getline, а затем разбейте его на int s, используя istringstream.
Вот как я могу улучшить это:

#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
0 голосов
/ 04 ноября 2018

Две проблемы:

  1. Первый цикл приведет к установке потоков failbit (когда он попытается прочитать '$' из второй строки). Если этот бит установлен, вы не можете читать больше из потока. Тебе нужно очистить состояние потока.

  2. После того, как вы сделали выше, второй цикл прочитает остальную часть файла.

Одним из возможных решений является чтение строк . Используйте, например, std::getline чтобы прочитать строку. Поместите строку в std::istringstream и прочитайте значения из этого.

...