VC的read函数读取文件,读取的数据比实际文件大小要少的问题
来源:互联网 发布:myeclipse导入java项目 编辑:程序博客网 时间:2024/05/16 05:50
用VC的read函数读取文件,读取的数据比实际文件大小要少的问题
今天用VC下编译libevent的http-server示例,却发现用浏览器怎么也打不开网页,跟踪下来,发现运行到 evbuffer_add_file 函数就阻塞了
起初怀疑是 libevent的evbuffer_add_file函数实现有Bug,所以自己写了个简单的实现来替换
//evbuffer_add_file(evb, fd, 0, st.st_size); char *xbuf = (char *)malloc(st.st_size); int n = read(fd, xbuf, st.st_size); if (n < (int)st.st_size) { n = read(fd, xbuf+n, st.st_size-n); } evbuffer_add(evb, xbuf, n); free(xbuf); close(fd);
现在可以打开网页了,但文件网页显示不完整,原来是read函数的问题,在这里read到的长度要比文件大小要小,即使反复read也不成功
在网上百度了windows下read的问题找到了答案,原来windows下的_open函数默认不是按二进制格式打开文件的,需要在open时增加O_BINARY标志
找到问题所在就好办了,修改http-server.cpp文件中open函数的参数后,一切正常
//if ((fd = open(whole_path, O_RDONLY)) < 0) {if ((fd = open(whole_path, O_RDONLY|O_BINARY)) < 0) {
附一个windows下使用open/read函数读取文件的示例,以备后用
#include <sys/stat.h>#include <io.h>#include <fcntl.h>#include <malloc.h>#ifndef S_ISDIR#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)#endif#ifdef WIN32#define stat _stat#define fstat _fstat#define open _open#define close _close#endifint main(int argc, char **argv){ int fd, n; char *buf; struct stat st; if ((fd = open("a.bin", O_RDONLY|O_BINARY)) < 0) { perror("open"); return 1; } if (fstat(fd, &st)<0) { perror("open"); close(fd); return 1; } printf("filesize: %d\n", st.st_size); buf = (char*)malloc(st.st_size); n = read(fd, buf, st.st_size); close(fd); if (n != (int)st.st_size) { printf("error: filesize = %d(bytes), read = %d(bytes)", (int)st.st_size, n); } return 0;}
0 0
- VC的read函数读取文件,读取的数据比实际文件大小要少的问题
- 为什么java读取sqlserver2008中的date数据类型的数据比实际的少2天?
- 用java从sql server2008中读取得到的date时间数据比数据库里的实际时间要少两天
- C语言read()函数:读文件函数(由已打开的文件读取数据)
- 一个VC++读取csv文件的函数
- python中读取文件函数read()、readline()、readlines()的区别
- 关于VC在64位系统下读取注册表启动项时遇见的读取的数据与实际不一致的问题
- 导入csv文件时,如果最后一列没有数据,读取出来的集合比抬头字段少,和数据中包含","如何处理?
- CFile Read 读取二进制的问题
- 读取文件的问题
- 读取文件的问题
- 关于fread函数读取到的数据和实际统计的和数据不一样
- 关于fread函数读取到的数据和实际统计的和数据不一样
- VC读取写入 ini文件内容的方法函数详解
- VC读取写入 ini文件内容的方法函数详解
- C++类中包含string类型数据使用read和write实现文件读取和输出时遇到的问题
- Java读取数据小数点少掉前面的0
- VC读取文件的文件版本号
- Spring声明式事务配置管理方法
- 扩展yEd - Graph Editor 搜索功能
- 员工积分制管理系统V1.0 介绍
- epoll的实现原理
- windows核心编程 学习笔记1
- VC的read函数读取文件,读取的数据比实际文件大小要少的问题
- LDO电源管理器件
- idea+mave+tomcat运行web项目
- 工厂模式
- error: cast from ‘void*’ to ‘int’ loses precision
- C++与flash通信安全沙箱问题
- Python中setuptools的简介
- dm8168的DSP和ARM添加库与调用
- android -- FileObserver 类用法及限制