如何在C中打开文件(fopen / fread)

时间:2012-07-06 17:20:55

标签: c fopen

我有一个运行ubuntu 12.04的嵌入式主板(beagleboard-xm),如果它是逻辑1或0,我想读取一个GPIO输入。如何在C中实现cat /sys/class/gpio/gpio139/value? (文件存储0或1)
我打开文件:

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

接下来我需要做什么?

5 个答案:

答案 0 :(得分:3)

如果您想阅读一个字符,请尝试以下方法:

int value = fgetc(fp);
/* error checking */
value = value - '0';

答案 1 :(得分:2)

尝试打开文件后,检查fopen()是否成功。

然后您可以使用任何stdio函数来读取数据:

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

也可能是其他人。您可能正在查看scanf()系列,但很可能不会使用它们,例如。哪种方式最合适取决于读取的数据;它是文本还是二进制文件。如果是单个字符,那么getc();如果它是文本和面向行的,可能是fgets();如果是二进制,可能是fread()

答案 2 :(得分:1)

您可以读取一个字节,或直到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将会阻塞直到数据可用。在这种情况下,只需将缓冲区的大小设置为您需要的最大字节数,再加上一个。

加号和fread中相应的-1仅适用于您读取的数据呈现为ASCII的情况,即“128”是三个ASCII字节“1”,“2”, “8”甚至可能是回车符,而不是二进制0x80。在这种情况下,缓冲区为零终止,使其成为一个C字符串,atol可以在其上运行以检索十进制数。

如果需要的是二进制值,则不需要这样的转换,并且可以在不进行调整的情况下读取完整缓冲区,避免将最后加一个字节设置为零,并且只从缓冲区返回一个转换值;如果只需要一个字节,则缓冲区[0]。

答案 3 :(得分:1)

如果您可以访问Linux标头,那么我建议您使用Linux API访问GPIO。

将此信息包含在您的文件中:

#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);

答案 4 :(得分:-1)

我认为如果你使用它会更好:

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

之后很容易从temp.txt中提取01