У меня есть очень большой, но лексикографически упорядоченный текстовый файл, в котором мне нужно найти записи как можно быстрее. Чтобы не проходить через все это для определенной записи, я сохранил определенные ключевые позиции, такие как a -> 0, b -> 4092 и т. Д., Где символ является первым появлением самого себя, а число является его позицией , который получается путем синтаксического анализа всего файла один раз с помощью getline () и добавления длины каждой строки в переменную count. Цель состоит в том, чтобы я мог пролистать файл с помощью seekg (pos), чтобы немного локализовать поиск. Кажется, это тоже работает, но иногда это не так, и я пришел сюда, чтобы спросить, почему. Соответствующий код выглядит примерно так:
long pos1 = 10800;
long pos2 = 99725;
ifstream txtFile("path/data.txt");
char temp[200];
txtFile.seekg(pos1, txtFile.beg);
txtFile.getline(temp, 100);
txtFile.getline(temp, 100);
cout << tmp << endl;
txtFile.seekg(pos2, txtFile.beg);
txtFile.getline(temp, 100);
txtFile.getline(temp, 100);
cout << tmp << endl;
Второй getline есть на всякий случай, если поток перескочил в конец строки.
В первом случае нет вывода. Просто пустая строка. Во втором случае выводом является обычная строка из текстового файла. Сам файл не содержит пустых строк.
Я немного растерялся. Сначала я подумал, что, возможно, тип данных fpos (который используется внутри seekg) просто очень мал и не может обрабатывать числа выше ~ 10.000, но потом мне удалось получить правильный поиск из диапазона 99.000. У кого-нибудь когда-нибудь была подобная проблема?
редактировать: я только что нашел возможную причину проблемы. В другом потоке, который занимался поиском, было рекомендовано повторно открыть ifstream, чтобы очистить флаги сбоя. Я сделал это, и теперь, по крайней мере, последующие звонки производят что-то. Это говорит мне, что, видимо, что-то идет не так во время звонка txtFile.seekg(pos1, txtFile.beg);
, но это не конец файла.
редактировать 2: я только что проверил, бит бит устанавливается после вызова getline, который ничего не получает.
Мой плохой, я искал ошибку не с того конца. Моя проблема не в поиске, а в функции getline из ifstream, использующей char [] вместо string, как я привык. Если массив был выбран слишком маленьким, а разделительный символ еще не найден, происходят плохие вещи. Убедитесь, что массив настолько большой, насколько это необходимо, или просто вызовите глобальную строку getline со строкой, чтобы избежать этого.
Других решений пока нет …