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