首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

:以rb+打开文件,读取到文件结尾,开始写文件,则写文件失败,不知道为什么

2012-09-20 
求助:以rb+打开文件,读取到文件结尾,开始写文件,则写文件失败,不知道为什么以下是源码本意是想打开一个二

求助:以rb+打开文件,读取到文件结尾,开始写文件,则写文件失败,不知道为什么
以下是源码

本意是想打开一个二进制文件,在其尾部加入一些特定信息如程序名称 版本号 校验值等
但是每次写文件都会返回失败,不知道为什么,获取的错误码是32

请各位帮忙分析分析,原因是什么,在此谢过了

C/C++ code
//返回值 0:失败 1:成功int fill_bin_file(char *filename,unsigned char file_data,long size){    FILE *fp;    long cur_size;    unsigned char val;    int j;    //============打开文件    fp = fopen(filename,"rb+");    if (fp == NULL)    {        printf("open file fail\n");        return 0;    }    //==========获取文件的当前长度    if (fseek(fp,0,SEEK_END)!=0)    {        printf("seek file fail\n");        fclose(fp);        return 0;    }    cur_size = ftell(fp);    //==========校验文件长度    if ((cur_size == -1)||(cur_size+32 >= size))    {        printf("get file size fail\n");        fclose(fp);        return 0;    }    printf("file current size is : %u\n",cur_size);    //=========计算从文件开始到当前位置的异或校验    crc_val = 0;    j=0;    if (fseek(fp,0,SEEK_SET)!=0)    {        printf("seek file fail\n");        fclose(fp);        return 0;    }    while(j<cur_size)    {        if (fread(&val,1,1,fp)!=1)        {            printf("read file error\n");            fclose(fp);            return 0;        }        crc_val ^= val;        j++;    }    //===========填充文件    while (cur_size < size-32)    {        if(fwrite(&file_data,1,1,fp)!=1)        {            printf("write file fail\n");            fclose(fp);            return 0;        }        cur_size++;        crc_val ^= file_data;    }    //==========填写后缀信息    //填写程序名    for (j=0;j<10;j++)    {        fwrite(&dev_type[j],1,1,fp);        cur_size++;        crc_val ^= dev_type[j];    }    //填写版本    for (j=0;j<10;j++)    {        fwrite(&version[j],1,1,fp);        cur_size++;        crc_val ^= version[j];    }    //填写保留    for (j=0;j<11;j++)    {        fwrite(&file_data,1,1,fp);        cur_size++;        crc_val ^= file_data;    }    //填写校验    fwrite(&crc_val,1,1,fp);    fclose(fp);    return 1;}


[解决办法]
 
fseek(fp, 0, SEEK_END);
//===========填充文件
while (cur_size < size-32)
{
if(fwrite(&file_data,1,1,fp)!=1)
{
printf("write file fail\n");
fclose(fp);
return 0;
}
cur_size++;
crc_val ^= file_data;
}
[解决办法]
楼主,换本合格的教材吧。
文件读写转换的时候要fseek一下都没讲的教材直接扔掉。
另外,要清除FILE的错误状态,具体函数自己查c库手册。

热点排行