消息关闭
    暂无新消息!
在一个帖子上(http://bbs.csdn.net/topics/391017450)看到unsigned char*指针可以转换为FILE *类型,我在程序中这样进行了转换,之后用fileno()将转换后的FILE *类型的变量转换为文件描述符,在用此文件描述符传输数据时却发生了问题,代码如下:

int fd;
unsigned char *addr1;
FILE *Faddr1;
Faddr1 = (FILE *)addr1;
fd = fileno(Faddr1);

之后对fd操作

 sendfile(sockfd, fd, offset1, size - len1)


这时候却发生了bad file descriptor的错误,其中的sockfd为socket文件描述符。
看代码的打印结果,FILE *的转换应该是成功了,转换后的Faddr1 与addr1值一样,fileno转换后得到的值打印出来的却是-1,问题应该出在这里,但fileno怎么知道Faddr1不是真正的文件流指针呢?有什么办法解决这个问题吗?

10个回答

︿ 3
强制转换成功不代表运行一定成功,强制转换是否可靠是需要程序员去保证的

你的Faddr1根本就没指向一块有效的内存,完全就是野指针,当然是不对的了
︿ 2
int _fileno(   
   FILE *stream   
);
  

函数调用是否成功,和参数stream的状态有关。具体可以参考:

https://msdn.microsoft.com/en-us/library/zs6wbdhx.aspx

备注:ISO标准使用_fileno。
︿ 1
文件描述符是打开文件时,返回的。不能从其他变量强制类型转换得来。
︿ 1

先不论楼主的这个转换是否有效,如果addr1是一个指向合法的内存空间,那么Faddr1 = (FILE *)addr1是没问题的。即使Faddr1定义的是一个野指针,但是这句Faddr1 = (FILE *)addr1让它指向了一个合法的地址,那就不是野指针了。
所以,这样强制类型转换没毛病,但是就是转换之后Faddr1是否可以当成FILE *类型使用,能否正确操作文件就不一定了。这个要看addr1是否是指向打开的文件描述符。
FILE*类型是一个指针,我转换后的FILE*也是一个指针,两者有什么区别?fileno()又是怎么知道它不是真正的文件流指针呢?
︿ 1
用c/c++,不仅要了解相应语言,而且要目标计算机的体系结构有一定的了解。
︿ 0
int fd;
unsigned char *addr1; //addr1并没有与某个文件关联。
FILE *Faddr1;
Faddr1 = (FILE *)addr1; //只是单纯的使两个指针变量的值相等,没有对应的文件存在,并不能达到期望的效果。
fd = fileno(Faddr1);


http://bbs.csdn.net/topics/391017450 
这个帖子中回答者赵四老师给出了一个范例,你可以对照这个例子看看。
︿ 0
废话......你又没有真的去打开哪个文件,你说能不能操作?这样做只能骗自己.
︿ 0

http://bbs.csdn.net/topics/391017450 
这个帖子中回答者赵四老师给出了一个范例,你可以对照这个例子看看。
我也看到了赵四老师的范例,但使用fileno()转换时发生了错误。不知道是不是没有转换成功,还是其他原因?