Чтение файла в C с файловым дескриптором

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

Я получаю его, вызывая open, и он отлично работает. В этот момент я знаю, что мне нужно использовать функцию read(), чтобы читать из нее. Моя проблема в том, что функция read() требует в качестве аргумента количество байтов для чтения, и я хочу каждый раз читать целую строку из файла, поэтому я не знаю, сколько байтов нужно прочитать.

Если я использую, например, fscanf(), он отлично работает с простой строкой, и я возвращаю всю строку, как хочу. Итак, мой вопрос:

Есть ли какая-нибудь функция, подобная fscanf(), которую можно вызвать с файловым дескриптором, а не с файловым указателем?


person Spyros Rokopanos    schedule 23.11.2012    source источник
comment
Ну, вы можете буферизовать входящие символы, и как только у вас будет достаточно (это может быть пробел или \n), вы можете запустить sscanf для полученного буфера. Помните, что буфер не будет завершаться NUL; вам придется добавить NUL самостоятельно.   -  person wildplasser    schedule 23.11.2012
comment
Почему вы не используете stdio?   -  person Fred Foo    schedule 23.11.2012


Ответы (2)


Когда вы говорите «должны использовать read()», я не могу сказать, это ваше понимание ситуации с учетом дескриптора файла из open() или ограничения на какое-то назначение.

Если у вас есть файловый дескриптор, но вам удобнее использовать fscanf() и друзей, используйте fdopen(), чтобы получить FILE * из вашего fd, и продолжайте использовать stdio.

Внутри он использует такие функции, как read(), в буфер, а затем обрабатывает эти буферы, когда вы читаете их с fscanf() и друзьями.

person Ben Jackson    schedule 23.11.2012
comment
Это было мое неправильное понимание ситуации. Единственное ограничение состоит в том, что я должен использовать дескриптор файла, а не просто вызывать fopen() с именем файла (и это потому, что это общая функция, в которой у меня нет имени файл, и я только передаю его файловый дескриптор в качестве аргумента из основного файла, а затем мне приходится работать с ним;)). Я не знал, что я могу получить указатель файла с помощью fdopen()... Думал, что единственный способ прочитать из него - использовать read()... Спасибо за вашу помощь.. :) - person Spyros Rokopanos; 23.11.2012

Что вы можете сделать, так это читать по одному символу за раз, пока вы не прочитаете всю строку и не обнаружите «/ n». Поскольку это домашнее задание, я не буду писать его за вас.

Однако следует предупредить о нескольких вещах.

  1. Вам нужно проверить наличие EOF, иначе вы можете попасть в бесконечный цикл.
  2. Вы должны объявить некоторый буфер, в котором вы читаете символ, а затем копируете его в буфер. Не зная вашего вклада, я не могу предложить размер, кроме как сказать, что для домашнего задания [256], вероятно, будет достаточно.
  3. Вам нужно убедиться, что вы не переполняете свой буфер, даже если вы превышаете его длину.
  4. Продолжайте читать, пока не найдете символ '/n'. Затем обработайте линию, которую вы создали, и начните следующую.
person PearsonArtPhoto    schedule 23.11.2012
comment
Спасибо за предложение ... Я думал о чем-то подобном, но если я смогу получить указатель файла и использовать fscanf, мне будет легче. - person Spyros Rokopanos; 23.11.2012