首页
社区
课程
招聘
关于读文件的一个小问题
发表于: 2010-6-7 11:35 3807

关于读文件的一个小问题

2010-6-7 11:35
3807
用c读取一个.dat文件,该文件头2个字节为某结构的大小,如何读取该2个字节获取其大小,int是4个字节啊,如何表示这个大小啊?这个大小是指该结构所占字节数?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
BYTE[2] == unsigned char[2]
2010-6-7 11:49
0
雪    币: 249
活跃值: (25)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
FILE * fp = fopen("***.dat", "rb");
        if(!fp)
        {return ;}
        int *pSize = new int[1];
        memset(pSize, 0, 4);
        fread(pSize, 1, 2, fp);
        fclose(fp);

        int i = *pSize;

别忘记释放pSize,没有检查代码,随手写的。大概这样就可以了
2010-6-7 12:08
0
雪    币: 2513
活跃值: (575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
unsigned short int nStructLen;
2010-6-7 12:23
0
雪    币: 17
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
2L,4L看不懂。。。
3L麻烦解释下,我相当小白啊

int *pSize = new int[1];
  memset(pSize, 0, 4);

UE打开那个文件,头2个字节时00 19,老师说其代表大小就是25,用3L的方法显示为6400。。。
2010-6-7 13:20
0
雪    币: 2513
活跃值: (575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
short int 就是相当于int的一半长度,也就是2字节
大小不为负数,所以加一个unsigned,这个可以看你个人喜好去加了
2010-6-7 14:12
0
雪    币: 249
活跃值: (25)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=gerrardgld;820341]2L,4L看不懂。。。
3L麻烦解释下,我相当小白啊

int *pSize = new int[1];
  memset(pSize, 0, 4);

UE打开那个文件,头2个字节时00 19,老师说其代表大小就是25,用3L的方法显示为6400。。。[/QUOTE]

一般的00 19,应该是1900H,也就是十进制的6400。但是你们老师说是25,应该是0019H。
说明顺序跟一般的不同。那就转换一下,在fread之后,
FILE * fp = fopen("***.dat", "rb");
        if(!fp)
        {return ;}
        char *pSize = (char *)new int[1];
        memset(pSize, 0, 4);
        fread(pSize, 1, 2, fp);
        BYTE bTemp = 0;
        memcpy(&bTemp, pSize, 1);
        memcpy(pSize, pSize + 1, 1);
        memcpy(pSize + 1, &bTemp, 1);
        fclose(fp);

        int i = *(int *)pSize;
这样有些麻烦,可能有更为简单的方法~
2010-6-7 14:19
0
雪    币: 17
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
typedef char   INT1;
typedef unsigned char UINT1;
typedef unsigned short UINT2;
typedef unsigned long UINT4;

#define MC_GET_CHAR(__data__)  (*((char *)(__data__)))
#define MC_GET_SHORT(__data__)  ((UINT2)(( ((UINT2)(*((char *)(__data__))))<<8 )|( ((UINT2)(*((char *)(__data__)+1)))&0x00ff )))
#define MC_GET_LONG(__data__)  ( ( ((UINT4)MC_GET_SHORT((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+2))&0x0000ffff ) )
#define MC_GET_3BN(__data__)  ( ( ((UINT4)MC_GET_CHAR((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+1))&0x0000ffff ) )

——————————————————————————————————————————————

#include <string.h>
#include <stdio.h>
#include <windows.h>
#include "Macro.h"
void main()
{
        int i;
        char buff[2];
        FILE*fp;
        fp=fopen("*.dat","r+");
        fscanf(fp,"%2c",buff);
        i=MC_GET_SHORT(buff);
        printf("%d\n",i);

       
}

ultraedit打开.dat文件显示开头俩个字节是00 19,然后用上述代码读就时25了,你们觉得这代码有问题么?
难道不应该时倒序么?00 19即1900H?
2010-6-7 14:36
0
雪    币: 249
活跃值: (25)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
“typedef char   INT1;
typedef unsigned char UINT1;
typedef unsigned short UINT2;
typedef unsigned long UINT4;

#define MC_GET_CHAR(__data__)  (*((char *)(__data__)))
#define MC_GET_SHORT(__data__)  ((UINT2)(( ((UINT2)(*((char *)(__data__))))<<8 )|( ((UINT2)(*((char *)(__data__)+1)))&0x00ff )))
#define MC_GET_LONG(__data__)  ( ( ((UINT4)MC_GET_SHORT((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+2))&0x0000ffff ) )
#define MC_GET_3BN(__data__)  ( ( ((UINT4)MC_GET_CHAR((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+1))&0x0000ffff ) )

——————————————————————————————————————————————

#include <string.h>
#include <stdio.h>
#include <windows.h>
#include "Macro.h"
void main()
{
  int i;
  char buff[2];
  FILE*fp;
  fp=fopen("*.dat","r+");
  fscanf(fp,"%2c",buff);
  i=MC_GET_SHORT(buff);
  printf("%d\n",i);

  
}

ultraedit打开.dat文件显示开头俩个字节是00 19,然后用上述代码读就时25了,你们觉得这代码有问题么?
难道不应该时倒序么?00 19即1900H?”

buff读出来就是00 19,这个是16进制的。如果我们用short来访问,就是1900H(倒序)。
(UINT2)(( ((UINT2)(*((char *)(__data__))))<<8 )假如把buff传进去,经过这个变换成为了一个值为0x0000的数。而( ((UINT2)(*((char *)(__data__)+1)))&0x00ff ))经过这个变换成为了一个值为0x1900的数。两个数做“或”运算,i在内存中就变成了19 00,因为i是int,应该是4个字节,采用倒序就成了** ** 00 19H。**表示未知,因为你不知道那块内存存的是什么,int i定义是你并没有初始化为零。所以建议你最好跟踪一下程序,然后看一下内存就明白了。int i最好换成short int
2010-6-7 15:16
0
雪    币: 17
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
谢谢各位了,虽然还是有点迷糊。。。
2010-6-7 15:40
0
游客
登录 | 注册 方可回帖
返回
//