поиск — C ++ искать странное поведение, возможно, ограничивает?

У меня есть очень большой, но лексикографически упорядоченный текстовый файл, в котором мне нужно найти записи как можно быстрее. Чтобы не проходить через все это для определенной записи, я сохранил определенные ключевые позиции, такие как 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, который ничего не получает.

1

Решение

Мой плохой, я искал ошибку не с того конца. Моя проблема не в поиске, а в функции getline из ifstream, использующей char [] вместо string, как я привык. Если массив был выбран слишком маленьким, а разделительный символ еще не найден, происходят плохие вещи. Убедитесь, что массив настолько большой, насколько это необходимо, или просто вызовите глобальную строку getline со строкой, чтобы избежать этого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]