user-0 提问: 关于其他类型指针转换为FILE*的问题

回复:
user: user-1
content: 你还是别学编程了吧，这么多人都教不懂你！！！！！！！！

user: user-0
content: [/quote] 我现在想用sendfile将缓存区中的数据发送到sockfd,但sendfile参数二fd必须为文件描述符，但我的数据存放在缓存区，所以有没有办法实现这一功能，使得sendfile可以将缓存区中的数据发送到sockfd？[/quote] 得，楼上几个都白说了！[/quote] 说不定有高手有奇技淫巧解决这问题呢

user: user-2
content: 引用 19 楼 hhhlizhao 的回复:[quote=引用 18 楼 zhao4zhong1 的回复:] 我现在想用sendfile将缓存区中的数据发送到sockfd,但sendfile参数二fd必须为文件描述符，但我的数据存放在缓存区，所以有没有办法实现这一功能，使得sendfile可以将缓存区中的数据发送到sockfd？[/quote] 得，楼上几个都白说了！

user: user-0
content: 引用 18 楼 zhao4zhong1 的回复: 我现在想用sendfile将缓存区中的数据发送到sockfd,但sendfile参数二fd必须为文件描述符，但我的数据存放在缓存区，所以有没有办法实现这一功能，使得sendfile可以将缓存区中的数据发送到sockfd？

user: user-3
content: 容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

user: user-3
content: 内存映射参考：// 创建文件句柄 HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 创建文件映射 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL); // 读取映射中的内存 LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);  // 好了文件的内存已经获取了，你可以随意处理了  // 释放映射内存 ::UnmapViewOfFile(lpBuffer); // 关闭文件映射 ::CloseHandle(hMap); // close file handle ::CloseHandle(hFile);

user: user-4
content: 楼主不要理解错赵老师代码的意义.  在C++中, 因为指针变量都有相同的长度, 所以下互转换, 不会损失信息. 这对于参数传递有重要意义.  (比如序列化和反序列化结构体)  但是这里, 想把一个缓冲区, 直接变成FILE*来访问, 那肯定是不行的. 强制转换的结果就是系统会按FILE*的结构体定义, 来访问这个缓冲区, 结果, 系统api发现这里的得到的成员变量不正确, 然后就会报错了.  你想做的是内存映射的话, 要严格按照内存映射的方式来做,  偷不了懒, 一步到位.

user: user-2
content: 用c/c++，不仅要了解相应语言，而且要目标计算机的体系结构有一定的了解。

user: user-5
content: 引用 7 楼 paschen 的回复:强制转换成功不代表运行一定成功，强制转换是否可靠是需要程序员去保证的  你的Faddr1根本就没指向一块有效的内存，完全就是野指针，当然是不对的了 先不论楼主的这个转换是否有效，如果addr1是一个指向合法的内存空间，那么Faddr1 = (FILE *)addr1是没问题的。即使Faddr1定义的是一个野指针，但是这句Faddr1 = (FILE *)addr1让它指向了一个合法的地址，那就不是野指针了。 所以，这样强制类型转换没毛病，但是就是转换之后Faddr1是否可以当成FILE *类型使用，能否正确操作文件就不一定了。这个要看addr1是否是指向打开的文件描述符。

user: user-5
content: 引用 5 楼 hhhlizhao 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 文件描述符是打开文件时，返回的。不能从其他变量强制类型转换得来。 那我现在需要将unsigned char *转换为FILE*进行操作，有什么其他方法实现吗？[/quote] 为什么要强制转换呢，为什么不通过打开文件返回呢

user: user-6
content: 引用 7 楼 paschen 的回复:强制转换成功不代表运行一定成功，强制转换是否可靠是需要程序员去保证的  你的Faddr1根本就没指向一块有效的内存，完全就是野指针，当然是不对的了 赞同～

user: user-3

user: user-7
content: 强制转换成功不代表运行一定成功，强制转换是否可靠是需要程序员去保证的  你的Faddr1根本就没指向一块有效的内存，完全就是野指针，当然是不对的了

user: user-8
content: int _fileno(       FILE *stream    );    函数调用是否成功，和参数stream的状态有关。具体可以参考：  https://msdn.microsoft.com/en-us/library/zs6wbdhx.aspx  备注：ISO标准使用_fileno。

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:文件描述符是打开文件时，返回的。不能从其他变量强制类型转换得来。 那我现在需要将unsigned char *转换为FILE*进行操作，有什么其他方法实现吗？

user: user-5
content: 文件描述符是打开文件时，返回的。不能从其他变量强制类型转换得来。

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

user: user-8
content: int fd; unsigned char *addr1; //addr1并没有与某个文件关联。 FILE *Faddr1； Faddr1 = (FILE *)addr1; //只是单纯的使两个指针变量的值相等，没有对应的文件存在，并不能达到期望的效果。 fd = fileno(Faddr1);  http://bbs.csdn.net/topics/391017450  这个帖子中回答者赵四老师给出了一个范例，你可以对照这个例子看看。

user: user-9
content: 废话......你又没有真的去打开哪个文件,你说能不能操作?这样做只能骗自己.

user: user-0
content: 我的addr1是一块内存区域mmap之后的指针。