Файловые дескрипторы и системные вызовы - PullRequest
0 голосов
/ 24 сентября 2011

Я делаю слияние k-отсортированных потоков с использованием системных вызовов read write.

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

struct filePointer {
int ptr;
int num;
}fptr[5];

Может кто-нибудь сказать мне, как это сделать.

Спасибо

1 Ответ

1 голос
/ 24 сентября 2011

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

Ваша структура должна быть такой:

struct filePointer {
FILE * fp;
int num;
} fptr[k]; /* I assume k is constant, known at compile time */

Вам необходимо иметь приоритетную очередь (http://en.wikipedia.org/wiki/Priority_queue), и приоритеты определяются в соответствии с числом.

Сначала прочитайте первые числа из всех файлов и вставьте их в очередь с приоритетами (pq).

Тогда, пока pq не пуст, выведите первый элемент, который содержит наименьшее целое число по сравнению с другими элементами в pq.

Записать целое число, которое первый элемент содержит в файл.

Используя указатель файла (fp), попробуйте прочитать новое целое число из входного файла.

Если EOF (конец файла), то ничего не делать

иначе вставьте новый элемент в pq, установив num в считанный.

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

Надеюсь, это поможет.

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