Искаженные символы, которые уничтожают доступ с помощью getline, как их заменить?

Я попытался получить доступ к файлу, который в какой-то момент содержит много искаженных символов. Я знаю, что это происходит после определенной строки (когда эта строка найдена с помощью getline: "key = 0"). Моя цель - избавиться от него, заменить всю строку на строку, т.е. "Привет", или заставьте \n символ в конце. Как мне это сделать? Вы сталкивались с этим раньше? Здесь я объясняю свой код, но пока не удается преодолеть проблему. Кажется, что в конце строки нет \n или есть символ, который не может быть прочитан. По сути, я хочу сделать программно то же, что и текст с командой "Заменить все".

Чтобы прояснить, как выглядит мой файл, вот оригинальный файл "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

1 ответ

Так что это легко сделать... однако, если в вашей строке есть символ EOF, я не знаю, пережил бы он переход на http://www.stackru.com/ и затем в мой код. Но я надеюсь, что вы просто перевернули break логика из моего 1-го ответа: /questions/46628486/kak-propustit-sleduyuschuyu-stroku-esli-uslovie-c/46628501#46628501

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

tm iTm;
string iString;
const auto replaceAll = "hello";

while(f >> get_time(&iTm, " %Y - %m - %d %T ") && getline(f, iString)) {
    cout << put_time(&iTm, "%F %T ") << iString << endl;

    if(iString == "key = 0"s) {
        cout << put_time(&iTm, "%F %T ") << replaceAll << endl;
        if(!f.ignore(numeric_limits<std::streamsize>::max(), '\n')) {
            break;
        }
    }
}

Из вашего входного файла этот код дает мне:

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 уэ
2017-08-03 09:38:46 er
2017-08-03 09:38:46 ключ = 0
2017-08-03 09:38:46 81B9CEandrew499OEE4MUI5Q0VhbmRyZXc0OTk =
2017-08-03 09:38:47 B9CEandrew499OEE4MUI5Q0VhbmRyZXc0OTk =
2017-08-03 09:38:48 бла
2017-08-03 09:38:49 ОК
2017-08-03 09:50:12 ключ = 0

Я написал пример: http://rextester.com/JCKF84982 но вам нужно поменять местами istringstream для ifstream,

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