我在学习一个简单的二进制文件读写操作时发现一个奇怪的问题。
pf = fopen(fpath,"rb+");  //fpath文件路径
if( pf==NULL )
    return false;
char* str="你好";
fwrite(str,4,1,pf);
char tmp[4]="";
fread(tmp,4,1,pf);以上是我测试的代码,应该说很简单的一段。本意是在文件开头写入你好俩字,在读出随后的4字节数据。
处理前文件内容:“一二三四五六”,处理后变成“你好屯屯五六”,屯屯二进制为CD CD CD CD。
这个结果出乎我的意料。随后我把fread那两行去掉了,结果就正确了,处理后变成“你好三四五六”。
也就是说,fread操作把原本的三四两字覆盖成了CD CD CD CD,我想请问高手这是为什么?我只是读操作阿。难道问题出在fopen参数rb+上面?

解决方案 »

  1.   

    你读出的4字节,你没有在其后加入NUL字符,因此读出的内容还不能成为一个“NULL结束的字符串”,当然由于你的内存还没有存放过数据,全部数据都是“屯屯...”,因此自然读出的内容就是“你好屯屯...”
      

  2.   

    额可能我没说清楚,我并不是说tmp在内存中是“你好屯屯”,而是我的文件内容修改成了“你好屯屯五六”,也就是说fread起到了写的作用,我奇怪是在这里!有兴趣可以试一下。
      

  3.   

    你的问题多多:FILE *pf;
    pf = fopen(fpath,"rb+");  //fpath文件路径
    fseek(pf,0,SEEK_END);
    if( pf==NULL )
        return false;
    char* str="你好";
    fwrite(str,sizeof(char),4,pf);
      

  4.   

    嗬嗬,楼上的,我只是截了一部分代码贴上。
    我本意是把文件最开头那里覆盖掉,SEEK_END并不需要。
      

  5.   

    如果单用fwrite或者单用fread都是对的。
    但混在一起用就要出错,奇怪阿
      

  6.   

    楼上说得没错,fwrite,fread要分开用
      

  7.   

    FILE* pf;
    pf = fopen("C:\\fx.txt","r+");  //fpath文件路径
    char* str="你好";
    fwrite(str,strlen(str),1,pf);
    fclose(pf);pf = fopen("C:\\fx.txt","rb+");
    char tmp[8]="";
    fread(tmp,sizeof(char),4,pf);
    fclose(pf);
    MessageBox(tmp);
      

  8.   

    主要是你的fwrite参数调用不对
    MSDN例子:
    #include <stdio.h>void main( void )
    {
       FILE *stream;
       char list[30];
       int  i, numread, numwritten;   /* Open file in text mode: */
       if( (stream = fopen( "fread.out", "w+t" )) != NULL )
       {
          for ( i = 0; i < 25; i++ )
             list[i] = (char)('z' - i);
          /* Write 25 characters to stream */
          numwritten = fwrite( list, sizeof( char ), 25, stream );
          printf( "Wrote %d items\n", numwritten );
          fclose( stream );   }
       else
          printf( "Problem opening the file\n" );   if( (stream = fopen( "fread.out", "r+t" )) != NULL )
       {
          /* Attempt to read in 25 characters */
          numread = fread( list, sizeof( char ), 25, stream );
          printf( "Number of items read = %d\n", numread );
          printf( "Contents of buffer = %.25s\n", list );
          fclose( stream );
       }
       else
          printf( "File could not be opened\n" );
    }
      

  9.   

    我觉得我的错误是在一组fopen,fclose当中同时使用了fwrite和fread,而并不是哪一个函数调用出错,因为把fwrite和fread任意去掉一个结果都是没问题的。
    我这串代码是测试函数用简单写的,并不严格,但功能上是正确的。
    只是有些奇怪为什么会有这样的冲突呢?MSDN中并没有找到相关内容阿