Простой вопрос по поиску файлов в C - PullRequest
0 голосов
/ 22 сентября 2010

Скажи, что я пишу в файл

Mesh: 1
    Vertices: 345
    Indices: 123
    V: 1,3,4 1,4,5 ..
Mesh: 2
    Vertices: 456
    Indices: 42
etc.

Как мне искать в любой позиции? Например. Я хочу пойти в Вершины: из сетки 2 или V: из сетки 3 и т. Д.

Как правильно поступить с этими вещами?

Ответы [ 4 ]

3 голосов
/ 22 сентября 2010

Обычно вы используете двоичный формат. Одним из способов было бы выделить определенное количество места в качестве заголовка в файле. Здесь вы помещаете номера мешей, число вершин и индексов и смещение в файл, где начинаются данные вершин. Вы читаете заголовок при загрузке файла, затем ищите подходящее место для чтения нужных вам данных.

1 голос
/ 22 сентября 2010

Нет эффективного способа случайного поиска в форматах текстовых файлов. Это потому, что вы не можете узнать смещение вправо в файле, не прочитав все содержимое раньше. Единственный способ их обработки - последовательный - от начала до конца.

Итак, прочитайте и проанализируйте весь файл в некоторой структуре данных в памяти. Затем используйте эту структуру вместо файла по мере необходимости.

Если файл слишком велик, чтобы хранить все в памяти (в наши дни это маловероятно), прочитайте файл, не сохраняя все в памяти - вместо этого сохраните только смещения файлов в начале каждого Mesh в массиве. Тогда вы можете легко искать в нужном месте.

0 голосов
/ 22 сентября 2010

Как указывалось в других ответах, C может искать только байтовые смещения в файлах.

Однако, если ваши объекты "Mesh" всегда хранятся в файле в числовом порядке, вам не нужно читать весь файл последовательно, чтобы найти Mesh, который вам нужен. Вместо этого вы можете выполнить двоичный поиск по файлу - всякий раз, когда вы пытаетесь найти позицию в файле, сканируйте заранее, чтобы найти следующую Mesh.

0 голосов
/ 22 сентября 2010

Откройте файл для чтения и читайте строку до конца файла (EOF) Для каждой строки чтения проверьте, соответствует ли строка вашему запросу. Если совпадение, сообщите и вернитесь. В противном случае перейдите к следующей строке.

Основная познавательная работа - проверка на совпадения. Имейте четко определенный формат и легко разбираемый формат строк, чтобы облегчить вашу работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...