![如何以二进制文件形式打开和读取字符设备?](https://linux22.com/image/191502/%E5%A6%82%E4%BD%95%E4%BB%A5%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E5%BD%A2%E5%BC%8F%E6%89%93%E5%BC%80%E5%92%8C%E8%AF%BB%E5%8F%96%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%EF%BC%9F.png)
我正在使用 USB,我想读取 /dev/bus/usb/00x/00y 中 USB 设备描述符的内容 - 它是一个字符设备。
我使用 fopen 将其作为带有“rb”参数的二进制文件打开。但是当我执行“查找”和“告诉”以获取文件大小时,它返回 0 字节大小。有没有办法将其作为二进制文件读取?
void ReadUsbDeviceDescriptor( const char* path )
{
FILE* usb_fd = NULL;
size_t lSize = 0;
if ( path != NULL )
{
usb_fd = fopen ( path, "rb");
if ( usb_fd != NULL )
{
fseek( usb_fd , 0 , SEEK_END );
lSize = ftell (usb_fd);
rewind( usb_fd );
printf("File: %s - Size: %lu bytes\n", path, lSize);
fclose( usb_fd );
}
else
{
printf("Could not open file %s\n", path );
}
}
}
这是结果:
File: /dev/bus/usb/001/001 - Size: 0 bytes
答案1
正如史蒂夫所提到的,文件大小在字符设备上几乎没有意义。
所以解决方案就是简单地打开、阅读、完成。这里 ftell 的目的是什么?如果你想提前分配一个缓冲区,答案是,你不能。
我建议你尝试一下你的程序用/dev/tty
.也许首先想想你期望会发生什么或应该发生什么。
还有一点是,在Unix系统上,所有文件都是二进制的,所以模式rb
不是必需的。在像 Windows 这样的系统上,它会有所不同,但在 Windows 上甚至不太可能存在/dev/usb
。