VC编程之用VC的read函数读取文件,读取的数据比实际文件大小要少的问题
小标 2018-11-15 来源 : 阅读 1066 评论 0

摘要:本文主要向大家介绍了VC编程之用VC的read函数读取文件,读取的数据比实际文件大小要少的问题,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之用VC的read函数读取文件,读取的数据比实际文件大小要少的问题,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之用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 
#include 
#include 
#include 

#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/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程