c++在构造函数中打开了文件成员函数却无法读写文件 财富值17

2016-09-25 16:43发布

编写一个基于v4l2的摄像头程序,在类的构造函数中打开了文件,然后在成员函数中操作文件

video::video(const char* dir) {     ...     if((_fd = open(dir, O_RDWR)) < 0) {         throw fileException();     }     ... }  void video::videoInit() {     struct v4l2_format fmt;     CLEAR(fmt);     fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;     fmt.fmt.pix.height = 1280;     fmt.fmt.pix.width = 720;     fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;     fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;     if(ioctl(_fd, VIDIOC_S_FMT, &fmt) < 0)     ... }

但是在成员函数中却无法用ioctl对设备进行操作,和open在同一个函数内才能用ioctl操作
请问是为什么呢,是因为构造函数执行完后自动关闭了文件吗,怎样才能在成员函数中也能操作?
编译环境是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609


这是根据 @jeppeter 所提到的原因进行的测试,两个函数中_fd是同一个值

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答

最开始因为是这句有问题:

没有看到你的全部代码,但从你给出的代码看,你应该在ioctl之前判断_fd的值,如果这个值是非法,那就要处理一下,很可能是因为你没有初始化成功这个_fd

C++里面对运算顺序是未定义的,上述句子可能从右往左运行, 这样_fd只会取值0或者1. 但是后来看到LZ打印出来的都是3... 难道是debug和release下的区别?

if((_fd = open(dir, O_RDWR)) < 0)

LZ有没有试过在ioctl成功时候打印出_fd的值?