VC的read函数读取文件,读取的数据比实际文件大小要少的问题
2014-06-10 17:15
288 查看
用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 #endif int 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; }
相关文章推荐
- 用VC的read函数读取文件,读取的数据比实际文件大小要少的问题
- 关于VC在64位系统下读取注册表启动项时遇见的读取的数据与实际不一致的问题
- C# 读取EXCEL文件出现数据丢失问题
- 如何处理ODBC中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- Oracle 数据文件大小问题!
- C# 读取EXCEL文件出现数据丢失问题
- 王爽_汇编语言 段中的实际数据大小与占用空间大小问题
- 于Excel文件上传读取数据的问题
- VC读取TXT文件数据(1)
- 关于.NET读取Excel文件到DataSet后数据丢失问题
- C# 读取EXCEL文件出现数据丢失问题
- 表空间数据文件大小问题
- vc里读取配置文件(ini)的问题
- C#读取excel文件数据丢失问题
- 读取csv文件数据内容进行图形绘制(vc++描述)
- Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决
- 读取excel文件显示在gridview中数据.字符.数字混合时无法全部读取的问题!
- ADO读取Excel文件,丢失数据或数据错误问题。
- 如何处理Oledb中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- ADO 读取Excel文件数据, 丢失数据或数据错误问题。