我正在开发一个C应用程序来评估来自USB激光扫描仪的数据,后者充当串行设备。出于测试目的,我还允许从文件中读取测试数据,因为总是连接扫描仪是不方便的。
我像这样打开文件/设备:
FILE *fp = fopen(argv[1], "a+b");根据我是否想从文件或设备中读取,我传递一个文件路径或类似于/dev/cu.usbmodemfd121 (我在Mac上)之类的东西。
只要我之前已经初始化了激光扫描仪,它就能正常工作,但我宁愿让我的应用程序这样做。但是,为了做到这一点,我必须首先弄清楚我是从文件还是从设备中读取数据。考虑到FILE * fopen**?**返回的,如何才能做到这一点?
我尝试使用fseek(fp, 1, SEEK_END),因为它的流没有“结束”,但出于某些原因,fseek没有失败。
发布于 2014-03-21 18:36:26
您可以使用fileno获取文件描述符,然后在其上执行fstat。它填充的struct stat包含的思想类似于st_mode,它显示fd的类型。我猜您的非文件设备S_ISCHR将为真,或至少S_ISREG将是假的。
如果你能控制它,就不要做fopen。直接使用open获取文件描述符,如果确实需要C流,则使用fdopen。
发布于 2014-03-28 13:03:20
@cnicutar的解决方案效果很好。下面是我最后得出的结论,以防对某人有帮助(为了清晰起见,删除错误检查):
#include <fcntl.h> /* open syscall */
#include <sys/stat.h>
int fd = -1;
int status;
FILE *fp = NULL;
struct stat fd_stat;
bool serial_device = false;
fd = open("/foo/bar/baz", O_RDONLY);
fp = fdopen(fd, "rb");
status = fstat(fd, &fd_stat);
printf("S_ISCHR: %d\n", S_ISCHR(fd_stat.st_mode));
printf("S_ISREG %d\n", S_ISREG(fd_stat.st_mode));
if(!S_ISREG(fd_stat.st_mode)) {
serial_device = true;
}https://stackoverflow.com/questions/22566844
复制相似问题