У меня есть текстовый файл, который содержит авторов и книги, написанные авторами. Мне поручено написать программу, в которой пользователь предоставит имя автора. И программа должна напечатать название любых книг, написанных этим автором.
Я понимаю, что я должен использовать ifstream для чтения этой информации. Но как я могу сделать так, чтобы моя программа не прочитать весь файл в память (массив, вектор и т. д.) для выполнения каких-либо поисковых запросов?
Как лучше всего подойти к этому? моя программа должна также использовать классы.
Я не знаю полного ответа или даже синтаксиса, но хороший способ начать — что вы знаете о формате входного текстового файла? Это просто файл из двух столбцов, например: [Книга авторов], разделенный общим разделителем? В этом случае вы могли бы создать цикл, который проходит через весь файл, и сохранять только записи в векторе, которые соответствуют строке поиска.
Здесь многое зависит от того, как часто вы будете искать книги из файла. Если вы собираетесь искать только один или два, то наиболее разумный метод, вероятно, состоит в том, чтобы просто сканировать пары строк для чтения файла, чтобы найти нужные.
Большинство других методов предполагают, что вы будете искать данные в файле достаточно часто, чтобы оправдать затраты дополнительного времени на оптимизацию запросов в дальнейшем. Предполагая, что это правильно, одной из возможностей будет создание индекса путем чтения файла, хэширования имени каждого автора и позиции в файле «записи» для этой пары автор / книга.
Затем вы сохраните эти пары смещения хеш / файл в отдельный файл. Когда вы захотите сделать запрос, вы прочитаете смещения хэшей / файлов в память. Хэшируйте имя автора, которого вы ищете (используя тот же алгоритм), и посмотрите, какие (если есть) смещения файла имеют одинаковое значение хеш-функции. Найдите эти места в файле и прочитайте запись в книге. В этот момент повторно сравните имя автора в файле с именем автора, которое было введено, в случае коллизии хеша. Покажите записи, где вы получите совпадение.