как открыть файл в C (fopen/fread)

У меня есть встроенная плата (beagleboard-xm), которая работает под управлением Ubuntu 12.04, я хотел бы прочитать один вход GPIO, если это логическая 1 или 0. Как я могу реализовать cat /sys/class/gpio/gpio139/value в C? (файл value хранит 0 или 1)
Я открываю файл следующим образом:

FILE *fp;
fp = fopen("/sys/class/gpio/gpio139/value", "rb");

что мне нужно делать дальше?


person johan    schedule 06.07.2012    source источник
comment
Вы должны просто иметь возможность читать один байт и переходить на основе его значения. Разве это нигде не задокументировано?   -  person Wug    schedule 06.07.2012


Ответы (5)


Вы можете прочитать один байт или до eof:

 char buffer[32]; // Very long number!

 if (NULL == (fp = fopen(FILENAME, "rb")))
 {
     // TODO: return a suitable error/perror
     return -1;
 }
 bytesread = fread(buffer, sizeof(char), sizeof(buffer)-1, fp);
 fclose(fp);
 if (!bytesread)
 {
     // Nothing at all was read
     // TODO: return error
     return -2;
 }
 // This is in case you want the byte interpreted from ASCII
 // otherwise you'd just return buffer[0], or (*(DATATYPE *)buffer)[0].
 buffer[bytesread] = 0x0;
 return atol(buffer);

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

Плюс один и соответствующий -1 в fread существуют только для случая, когда данные, которые вы читаете, отображаются как ASCII, т. е. "128" - это три байта ASCII "1", "2", "8" и, возможно, даже возврат каретки вместо двоичного 0x80. В этом случае буфер завершается нулем, чтобы сделать его строкой C, с которой atol может работать для извлечения десятичного числа.

Если требуется двоичное значение, то такое преобразование не требуется, и можно прочитать весь буфер без корректировок, не устанавливать последний плюс один байт в ноль и просто вернуть приведенное значение из буфера; или buffer[0], если нужен только один байт.

person LSerni    schedule 06.07.2012

Если вы хотите прочитать один символ, попробуйте следующее:

int value = fgetc(fp);
/* error checking */
value = value - '0';
person cha0site    schedule 06.07.2012

После попытки открыть файл вы убедитесь, что fopen() удалось.

Затем вы можете использовать любую из функций stdio для чтения данных:

  • getc()
  • fgetc()
  • fgets()
  • fread()

и, вероятно, другие тоже. Возможно, вы смотрите на семейство scanf(), но, скорее всего, не будете их использовать, например. Что наиболее подходит, зависит от считываемых данных; это текст или это двоичный файл. Если это один символ, то getc(); если он текстовый и линейный, возможно, fgets(); если двоичный, вероятно, fread().

person Jonathan Leffler    schedule 06.07.2012

Если у вас есть доступ к вашим заголовкам Linux, я бы рекомендовал вам получить доступ к GPIO с помощью Linux API.

Включите это в свой файл:

#include <linux/gpio.h>

Теперь у вас есть доступ к таким функциям, как:

  • int gpio_is_valid(int number);
  • int gpio_get_value(unsigned gpio);
  • void gpio_set_value(unsigned gpio, int value);

В вашем случае вы можете просто написать это:

int io_ret = -1;
if (gpio_is_valid(139))
    io_ret = gpio_get_value(139);
person Felipe Tonello    schedule 06.07.2012

я думаю, будет лучше, если вы использовали:

system("echo  /sys/class/gpio/gpio139/value >> temp.txt ");

после этого легко вы можете просто извлечь значение из temp.txt, которое будет либо 0, либо 1

person tabo    schedule 18.11.2014