Есть ли способ открыть файл, содержащий большой объем данных, и получить только одну конкретную строку или индекс, не получая при этом остального содержимого?
Обновлять:
Основываясь на том, что другие упомянули здесь в комментариях, у меня есть несколько дополнительных вопросов.
Может ли кто-нибудь дать мне пример того, как установить фиксированную ширину для строк / разрывов строк (как бы вы это ни называли) или показать мне хороший источник, где я могу прочитать об этом больше?
Значит, если я настрою это правильно, я смогу сверхбыстро получить конкретную строку из файла, даже если он содержит несколько миллионов строк?
Если бы строки имели одинаковый размер (на диске), это могло бы быть иначе, я так не думаю.
в файлах нет строк (и столбцов). Это просто поток битов и байтов. Только если, как уже предлагали другие, строки имеют фиксированную ширину, вы можете перейти к определенной позиции внутри файла, не читая символ за символом, чтобы увидеть, есть ли разрыв строки
@johnnymopp Я хочу знать, как я могу создать эту структуру и какой файл мне нужно использовать в этом случае, если это возможно. Я открыт для любых вариантов. На данный момент данных нет, планирую заранее
О какой структуре вы говорите? Это удобочитаемый формат или двоичный?
Основываясь на том, что другие упомянули здесь в комментариях, у меня есть несколько дополнительных вопросов. Я обновил свой вопрос. @Thomasmatthews, как насчет того и другого :)
При создании файла используйте setw
для установки ширины поля. Также убедитесь, что в строках одинаковое количество полей.
Если вы планируете иметь данные и получать к ним доступ, рассмотрите возможность использования внешней базы данных. Найдите в Рекомендации по программному обеспечению библиотеки баз данных и интерфейсов. Намного лучше, если вы реализуете таблицы в файлах и таблицах индексации, а также код для поиска и обслуживания данных.
Если вы хотите получить доступ к файлу по записям или строкам, а строки не имеют фиксированной длины, вам придется создать структуру, в которой вы можете связать (или сопоставить) позиции файлов с индексами строк.
Рекомендую использовать std::vector<std::streampos>
.
Прочтите файл .
Когда файл находится в начале строки, прочтите положение файла и добавьте его к вектору.
Если вам нужен доступ к строке в файле:
1) Используйте вектор, чтобы получить положение строки в файле.
2) Перейдите к строке, используя позицию файла.
Этот метод работает с рядами фиксированной и переменной длины.
Я не хочу читать весь файл. Я хочу начать с правильного момента
Если вы не хотите строить вектор позиций файла, сделайте строки в файле фиксированной длины. Вы можете захотеть записать структуры в двоичный файл. Поищите в Интернете "сериализацию C++" или "сериализацию C++ boost".
Спасибо. Но как мне начать сканирование файла с этой конкретной позиции и пропустить все, прежде чем
Это зависит от структуры файла. Все ли строки одинаковой длины? Вам нужно добавить больше деталей.