Как пропустить следующую строку, если условие C++

Я посмотрел другие примеры, но я не могу заставить это работать. У меня есть файл, который в какой-то момент содержит странные символы, например: "Äèîpg". Я не хочу сохранять эту строку, потому что кажется, что цикл с getline остановится (он сохраняется до строки с мусором). Как я мог сделать это, пожалуйста? Я знаю, что когда это происходит: "key =0", следующая строка будет иметь эти символы "Äèîpg".

Вот мой код:

    file = "example.log";
    ifstream f(file);
    f.open(file);
    if (f.good()){
        while (getline(f, line)) {
            lineNumber++;
            if ((lineNumber>= line1 - 20) && (lineNumber<= line2)){
                pos = line.find("key = 0");
                if (pos != string::npos){
                    std::cout << "skip the line" << endl;

                }
                else{
                    Type v;
                    v.line= line;
                    v.index = lineNumber;
                    linesVector.push_back(v);
                }
            }
        }
    } 
    f.close(); 

Затем я создаю вырезанный файл с необходимой мне информацией:

    ofstream myfile;    
    string merge =  file + "_Cut.log";  
    myfile.open(merge);     
    for (unsigned int i = 0; i < linesVector.size(); i++){      
        myfile << linesVector[i].line << "\n";      
        //std::cout << linesVector[i].line << endl;     
    }   
    myfile.close();

Заранее спасибо за вашу помощь!

Чтобы прояснить, как выглядит мой файл, вот оригинальный файл "example.log" (я не могу его прикрепить).

2017-08-03 09:38:46 Expeum im6
2017-08-03 09:38:46 nubla4
2017-08-03 09:38:46 blaze
2017-08-03 09:38:46 ue
2017-08-03 09:38:46 er
2017-08-03 09:38:46 key = 0
2017-08-03 09:38:46 Q2žl2pE&ö³„Ôï¬ÈL+g…^cÎ1áø/7E›¸¥ü‰úLÎ’Æ
2017-08-03 09:38:46 81B9CEandrew499OEE4MUI5Q0VhbmRyZXc0OTk=
2017-08-03 09:38:47 B9CEandrew499OEE4MUI5Q0VhbmRyZXc0OTk=
2017-08-03 09:38:48 bla
2017-08-03 09:38:49 OK
2017-08-03 09:50:12  key = 0
2017-08-03 09:50:12 E&ö³„Ôï¬ÈL+g…^cÎ1áø/7E›¸¥ü‰úLÎ’Æ

и вот что я получаю в вырезанном файле:

2017-08-03 09:38:46 Expeum im6
2017-08-03 09:38:46 nubla4
2017-08-03 09:38:46 blaze
2017-08-03 09:38:46 ue
2017-08-03 09:38:46 er
2017-08-03 09:38:46 key = 0
2017-08-03 09:38:46 Q2žl2p

Проблема в том, что он застрял в последнем гиберрише и не может двигаться дальше! Может быть, не хватает возврата каретки? У меня заканчиваются идеи.

1 ответ

Решение

Похоже, вы пытаетесь выбросить строку "ключ = 0" и следующую строку?

Если это так, вы можете просто использовать ignore во вложенном if -представление, как это: f.ignore(numeric_limits<std::streamsize>::max(), '\n')

Если lineNumber следует учитывать это строку, которую вы также должны будете добавить ++lineNumber,

Если это может быть последняя строка в файле, вы должны добавить этот код всего:

if(!f.ignore(numeric_limits<std::streamsize>::max(), '\n')) {
    break;
}
++lineNumber;

Живой пример

Другие вопросы по тегам