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

大家好,小弟我用fwrite()和fread()函数时发现一个奇怪的有关问题

2012-04-12 
大家好,我用fwrite()和fread()函数时发现一个奇怪的问题是这样的,我用fwrite()把一个int型数组里写入到一

大家好,我用fwrite()和fread()函数时发现一个奇怪的问题
是这样的,我用fwrite()把一个int型数组里写入到一个非二进制文本中,然后用fread()函数读出,数组的数为特定的一系列值后,会对输出产生干扰,比如本来读出10*(sizeof(int))大的内存数据后,文件内部指针本应该移到39处(int为4字节大小)但结果却是会直接跳到179处 下面是源码,大家有兴趣可以试试,我就想搞清楚这到底是什么原因

C/C++ code
    #include <stdio.h>    #include <stdlib.h>    #include<string.h>    #define N 5    int main()    {    FILE *fpFile;    int nArray[10]={1,2,3,4,5,6,7,8,9,10};    int offSet;    int i ,j,temp;    int r;    int w;    long flen;    if((fpFile=fopen("data.txt","w"))==NULL)    {    printf("Open file failed!\n");exit(0);    }    for(j=0;j<N;j++)    {        i=0;        while(i<10)        {    nArray[i]+=10;            i++;        }        w=fwrite(nArray,sizeof(int),10,fpFile);    }    fclose(fpFile);    //写入完成    //开始读出并输出    if((fpFile=fopen("data.txt","r"))==NULL)    {        printf("Open file failed!\n");exit(0);    }    flen=ftell(fpFile);    printf("\n%ld\n",flen);    while(!feof(fpFile))    {        memset(nArray,0,sizeof(nArray));        if(r=fread(nArray,sizeof(int),10,fpFile))        {            printf("\n%d\n",r);            flen=ftell(fpFile);                        /* 得到大小 */            printf("\n%ld\n",flen);            i=0;            while(i<10)            {                printf("%6d",nArray[i]);                i++;            }            printf("\n");        }        else break;    }    //此处直接测试读第四个块,可以发现读出正常    printf("\nread the data of block 4:\n");    offSet=3*(sizeof(int)*10 );//即要读第四块    fseek(fpFile,offSet,SEEK_SET);    fread(nArray,sizeof(int),10,fpFile);    printf("\n");    i=0;    while(i<10)    {printf("%6d",nArray[i]);i++;}    printf("\n");    fclose(fpFile);    return 0;    }


[解决办法]
文本没有二进制和非二进制的区别。
打开和创建时候的二进制选项(b)的作用是,处理\n.
如果没b的选项,fprintf,fwrite,等时候,碰到 \n也就是 0x0a的时候,会将\n转换成\r\n.
读取的时候反过来转换。
有b的时候,不做转换。
所以,使用fread,fgetc之类的,必须要b。


[解决办法]
26好像是ctrl z,文本文件中的文件结束符?二进制文件就不要用文本方式打开
[解决办法]
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

热点排行