Linux C读单字节?

时间:2015-04-22 02:16:27

标签: c linux unix

我在JNA中工作以调用C函数,而且我已经习惯了读取单个字节的Java read()函数。有没有办法在C中执行此操作而不声明缓冲区?

4 个答案:

答案 0 :(得分:2)

char oneByte;
int r=read(fd, &oneByte, 1);

是的,应该工作。

答案 1 :(得分:1)

这取决于您是否要读取流(即文件*)或文件描述符。

对于流,您有

getc(FILE *stream);

对于文件描述符,您可以使用字节变量作为缓冲区,例如

unsigned char b; //or signed if you prefer
read(fd, &b, 1);

答案 2 :(得分:1)

关于建议使用read()的答案,它应该如下所示:

char b;
int r;
while((r=read(fd,&b,1))==-1 && errno==EINTR) {}
if(r==.....

原因是,在传递信号的情况下,read()被中断并需要重新启动。如果你没有测试EINTR,你可能会面临随机,很难找到错误。

答案 3 :(得分:0)

您可以使用getchar()从标准输入获取单个字节,或fgetc()从任意文件句柄(流)获取它,例如:

int ch = getchar();
// Assuming ch >= 0, you have your byte

或:

FILE *in = fopen ("input.txt", "r");
// should check for NULL return
int ch = fgetc (in);
// Assuming ch >= 0, you have your byte

如果您有文件描述符而不是句柄,则可以使用read(),例如:

int fd = open ("input.txt", O_RDONLY, 0); // should check fd for -1
char ch;
ssize_t quant = read (fd, &ch, 1);
// Assuming quant > 0, ch will hold your byte