как да отворите файл в C (fopen/fread)

Имам вградена платка (beagleboard-xm), която работи с ubuntu 12.04, бих искал да прочета един GPIO вход, ако е логическа 1 или 0. Как мога да внедря cat /sys/class/gpio/gpio139/value в C? (стойност файлът съхранява 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);

Този код всъщност не е толкова общ, тъй като много хардуерни устройства ще внедрят блокиращ канал за данни - тоест, ако се опитате да прочетете повече данни, отколкото са там, страхът ще блокира, докато данните станат налични. В такъв случай просто оразмерете буфера до максималния брой байтове, от който се нуждаете, плюс един.

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

Ако това, което е необходимо, е двоична стойност, тогава не е необходимо такова преобразуване и човек може да прочете пълния буфер без корекции, да избягва настройването на последния плюс един байт на нула и просто да върне преобразувана стойност от буфера; или буфер [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 с помощта на API на Linux.

Включете това във вашия файл:

#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