有个文件的前4个字节保存着一个int型数据,值是15098,请问怎么把这个值15098取出来?

解决方案 »

  1.   

    用fread函数用fread函数用fread函数用fread函数
      

  2.   

    int a;
    CFile fff;
    fff.Open("ttt.dat", ...);
    fff.Read(&a, sizeof(int));
    fff.Close();Over
      

  3.   

    用c++的文件流
    然后 
    int a;
    fin >> a;
      

  4.   

    先多谢,不过,用3楼的方法得出的是负数。
    用2楼的方法:得出的值是空的。不知怎么回事了。
    FILE *stream1;
    char *list = new char[4];
    if( (stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL )
    {   
      numread = fread( list, sizeof( int ), 1, stream1 );  
      fclose( stream1 );
    }
      int filelength = 0;
      sscanf(list,"%d",&filelength);  delete []list;
      list = NULL;
      

  5.   

    int filelength
    fread( &filelength, sizeof( int ), 1, stream1 ); 
      

  6.   

    先多谢。7楼:我的出来的filelength 是负数,值怎么是:-1989672960  ?
     int filelength = 0;
     if( (stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL )
    {   
       numread = fread( &filelength, sizeof( int ), 1, stream1 );  
    }
    fclose( stream1 );
      

  7.   

    int 是不是 反着放的?这样稍微动一动int b = (a & 0x000000FF) << 24 
            + (a & 0x0000FF00) << 8 
            + (a & 0x00FF0000) >> 8 
            + (a & 0xFF000000) >> 24 
      

  8.   


    先谢。代码改动如下,b的值一直为零。结果还是不对。我再看看。
              int filelength = 0;      
      if( (stream1 = fopen("\\Program Files\\stream.dat","r+t")) != NULL)
      {   
      numread = fread( &filelength, sizeof( int ), 1, stream1 );  
      }
       int b = (filelength & 0x000000FF) << 24 
          + (filelength & 0x0000FF00) << 8 
                    + (filelength & 0x00FF0000) >> 8 
                      + (filelength & 0xFF000000) >> 24;   
      fclose( stream1 );
      

  9.   

    我的这个要打开的dat文件可以从这里下载:http://wap.goonews.cn/page?off_id=100&time_id=7242&page=2&from=kjava&rid=10000&uid=100&verson=2保存为stream.dat就可以。
      

  10.   

    把那四个字节读到char * 指向的数据里去或则字符串里面去,让后用atoi转换可以
    例如: 
    char *d = "15089";
    int c = atoi(d);
      

  11.   

    如果是文件的前4个字节保存着一个int型数据的话,可以这样试试
      

  12.   

    回复楼上,filelength 的值在那一步是:-1989672960
    我应该得出结果是26761就对了。
      

  13.   

    看来你是字节次序不相符,
    再用9楼的方法转一下
    C/C++ code 
    FILE *stream1; 
    //char *list = new char[4]; 
    int filelength = 0; 
    if( (stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL ) 
    {          
      numread = fread( &filelength , sizeof( int ), 1, stream1 ); filelength  = (filelength & 0x000000FF) << 24 
                  + (filelength & 0x0000FF00) << 8 
                    + (filelength & 0x00FF0000) >> 8 
                      + (filelength & 0xFF000000) >> 24;  
      fclose( stream1 ); 

      

  14.   

    谢。可是还是不行。在这一步:numread = fread( &filelength , sizeof( int ), 1, stream1 );  filelength值是:-1989672960
    在这一步过后:filelength  = (filelength & 0x000000FF) << 24 
                  + (filelength & 0x0000FF00) << 8 
                    + (filelength & 0x00FF0000) >> 8 
                      + (filelength & 0xFF000000) >> 24;
    filelength值是:0
      

  15.   


    刚才没有注意优先级,改成这样就可以了。
    filelength  = ((filelength & 0x000000FF) << 24) 
    + ((filelength & 0x0000FF00) << 8) 
    + ((filelength & 0x00FF0000) >> 8) 
    + ((filelength & 0xFF000000) >> 24);
      

  16.   

    这句话的意思是把数据正过来?具体如何理解?filelength  = ((filelength & 0x000000FF) << 24) 
                  + ((filelength & 0x0000FF00) << 8) 
                   + ((filelength & 0x00FF0000) >> 8) 
                    + ((filelength & 0xFF000000) >> 24);
      

  17.   

    DWORD len=0;
    DWORD readed=o;
    ReadFile(hfile,&len,4,&readde,null);
    len就是你要的头四个字节的int值。
      

  18.   

    英雄之不知道  little and big endianness  一说?
      

  19.   

    如果是用文件保存, 考虑字节序问题(little-endian or big-endian), 然后, 写出就行了.
      

  20.   

    真还不知道little and big endianness  这一说。不太理解
      

  21.   

    以你的那个文件长度int filelength =26761为例,它的16进制表示为0x00006889
    在低字节在前(little-endian )表示的机器上,这个整数在内存的次序为 89 68 00 00
    在高字节在前(big-endian )表示的机器上,这个整数在内存的次序为 00 00 68 89而int filelength =-1989672960,它的16进制正好是0x89680000
      

  22.   

    比如说你这个int a = 15098
    在x86平台上, 内存的存储方式从高向低,依次是00, 00, 3A, FA
    这就叫little-endian, 反之, 叫big-endian, 例如在Motorola平台上, 从高向低, 依次是FA, 3A, 00, 00
    如果, 在x86平台, 文件存储需要按little-endian方式存储, 直接file.write((BYTE*)&a, 4), 按big-endian方式存储, 需要交换字节序为
    FA, 3A, 00, 00, 然后,再写入.
    如果, 在Motorola平台, 原理与前述类似...
      

  23.   

    有个文件10个字节,读文件的5-6字节至一个变量。这么写可以吧?如下:
    short fileindex;
    if((stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL ) 
    {          
          numread = fread( &fileindex, sizeof( short ), 1, &stream1 + 4); 
    }
      

  24.   

    我知道用fseek,可总不成功。对于short 值为2的,总是等于512,很疑惑。