прыжки строки в файле с помощью c - PullRequest
0 голосов
/ 10 марта 2011

привет, я пытаюсь отсортировать текстовый файл, используя язык программирования c, для сортировки файла я использую уникальный ключ, мне нужно иметь возможность переходить от строки к строке, чтобы отсортировать файл, проблемав том, что я не знаю, есть ли в c команда, которая позволяет мне перейти с первой строки, скажем, на 20 строк, например, единственное решение, которое я знаю, это использовать каждый раз fscanf с циклом, но это решениене очень эффективно РЕДАКТИРОВАТЬ:
еще одна проблема, с которой я сталкиваюсь, заключается в том, что я не могу прочитать весь файл в память, это своего рода задание, данное в курсе управления файлами, я могу читать только 2 записи одновременно, когда неsort

Дело в том, что это не бинарный файл, такие параметры, как функции

 fseek(filepointer,number of bits,SEEK_SET)

, не могут мне помочь, потому что мне нужно прыгать по строкам

заранее спасибо за вашвремя.

Ответы [ 5 ]

1 голос
/ 10 марта 2011

В библиотеке C нет функции для перехода к определенной строке в файле.

То, что вы можете сделать (если не считать весь файл в памяти), - прочитать файл один раз, исохранить начальную позицию каждой строки в массиве.Используя этот массив, вы можете искать непосредственно в начале каждой строки.

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

И, наконец, может оказаться полезным изучить другие алгоритмы сортировки, которые не требуют произвольного доступа к файлу (по ценеПроизводительность, связанная с вводом-выводом) - приходит на ум Mergesort.

0 голосов
/ 11 марта 2011

Последовательное чтение текстовой строки можно выполнить с помощью fgets(), fseek не поможет при исключении текста, если он структурирован с фиксированной длиной.

Разрешено ли mmap()? потому что если это так, вы можете анализировать память и сохранять смещения строк в массиве (возможно, с использованием realloc). Тогда вы будете уметь использовать функцию qsort (), работающую в O (n log n) вместо O (n ^ 2), если перечитывает все строки для каждой строки.

Удачи!

0 голосов
/ 10 марта 2011

Часть пропуска строки очень проста.Чтобы прочитать конкретную строку, просто перейдите к началу файла и используйте цикл с fgets, чтобы получить каждую строку, пока не дойдете до той, которая вас интересует. Это подход грубой силы, который может оскорбить ваше чувство эстетики, нокомпьютеры были изобретены для выполнения этой работы.

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

0 голосов
/ 10 марта 2011

Помогая в куче ftell, fseek и fsetpos, можно отслеживать положение каждой строки в файле.

Кроме того, если строка не имеет фиксированной ширины, то замена строк на месте будетчрезвычайно сложно.

Удачи.

0 голосов
/ 10 марта 2011

Строковое считывание файла в массив (char *[]), затем сортировка.Прыгать в текстовом файле очень сложно;перетасовывать строки вокруг места еще сложнее.

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

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