有个文件的前4个字节保存着一个int型数据,值是15098,请问怎么把这个值15098取出来? 有个文件的前4个字节保存着一个int型数据,值是15098,请问怎么把这个值15098取出来? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用fread函数用fread函数用fread函数用fread函数 int a;CFile fff;fff.Open("ttt.dat", ...);fff.Read(&a, sizeof(int));fff.Close();Over 用c++的文件流然后 int a;fin >> a; 先多谢,不过,用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; int filelengthfread( &filelength, sizeof( int ), 1, stream1 ); 先多谢。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 ); int 是不是 反着放的?这样稍微动一动int b = (a & 0x000000FF) << 24 + (a & 0x0000FF00) << 8 + (a & 0x00FF0000) >> 8 + (a & 0xFF000000) >> 24 先谢。代码改动如下,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 ); 我的这个要打开的dat文件可以从这里下载:http://wap.goonews.cn/page?off_id=100&time_id=7242&page=2&from=kjava&rid=10000&uid=100&verson=2保存为stream.dat就可以。 把那四个字节读到char * 指向的数据里去或则字符串里面去,让后用atoi转换可以例如: char *d = "15089"; int c = atoi(d); 如果是文件的前4个字节保存着一个int型数据的话,可以这样试试 回复楼上,filelength 的值在那一步是:-1989672960我应该得出结果是26761就对了。 看来你是字节次序不相符,再用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 ); } 谢。可是还是不行。在这一步:numread = fread( &filelength , sizeof( int ), 1, stream1 ); filelength值是:-1989672960在这一步过后:filelength = (filelength & 0x000000FF) << 24 + (filelength & 0x0000FF00) << 8 + (filelength & 0x00FF0000) >> 8 + (filelength & 0xFF000000) >> 24;filelength值是:0 刚才没有注意优先级,改成这样就可以了。filelength = ((filelength & 0x000000FF) << 24) + ((filelength & 0x0000FF00) << 8) + ((filelength & 0x00FF0000) >> 8) + ((filelength & 0xFF000000) >> 24); 这句话的意思是把数据正过来?具体如何理解?filelength = ((filelength & 0x000000FF) << 24) + ((filelength & 0x0000FF00) << 8) + ((filelength & 0x00FF0000) >> 8) + ((filelength & 0xFF000000) >> 24); DWORD len=0;DWORD readed=o;ReadFile(hfile,&len,4,&readde,null);len就是你要的头四个字节的int值。 英雄之不知道 little and big endianness 一说? 如果是用文件保存, 考虑字节序问题(little-endian or big-endian), 然后, 写出就行了. 真还不知道little and big endianness 这一说。不太理解 以你的那个文件长度int filelength =26761为例,它的16进制表示为0x00006889在低字节在前(little-endian )表示的机器上,这个整数在内存的次序为 89 68 00 00在高字节在前(big-endian )表示的机器上,这个整数在内存的次序为 00 00 68 89而int filelength =-1989672960,它的16进制正好是0x89680000 比如说你这个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平台, 原理与前述类似... 有个文件10个字节,读文件的5-6字节至一个变量。这么写可以吧?如下:short fileindex;if((stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL ) { numread = fread( &fileindex, sizeof( short ), 1, &stream1 + 4); } 我知道用fseek,可总不成功。对于short 值为2的,总是等于512,很疑惑。 WSASocketW和send函数能提速吗 麻烦大家给推荐几个C/S开源项目 我想在工具栏的最又端加个图标显示? 招聘网上兼职做vc++程序的程序员! lib文件 如何使一个运行在其它类型用户下的进程拥有在ADMINISTRATOR用户下运行时的访问令牌的许可? 向各位请教!(愿给50分) 大家好,为了大家更好的学习VC++、c# 、OpenGL,加OpenGL技术群 Installsheild升级包,如何得到已经安装的程序的路径 重启explorer.exe问题 StretchBlt使用过程中出现的诡异的问题(续) 《》注册代码
CFile fff;
fff.Open("ttt.dat", ...);
fff.Read(&a, sizeof(int));
fff.Close();Over
然后
int a;
fin >> a;
用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;
fread( &filelength, sizeof( int ), 1, stream1 );
int filelength = 0;
if( (stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL )
{
numread = fread( &filelength, sizeof( int ), 1, stream1 );
}
fclose( stream1 );
+ (a & 0x0000FF00) << 8
+ (a & 0x00FF0000) >> 8
+ (a & 0xFF000000) >> 24
先谢。代码改动如下,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 );
例如:
char *d = "15089";
int c = atoi(d);
我应该得出结果是26761就对了。
再用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 );
}
在这一步过后:filelength = (filelength & 0x000000FF) << 24
+ (filelength & 0x0000FF00) << 8
+ (filelength & 0x00FF0000) >> 8
+ (filelength & 0xFF000000) >> 24;
filelength值是:0
刚才没有注意优先级,改成这样就可以了。
filelength = ((filelength & 0x000000FF) << 24)
+ ((filelength & 0x0000FF00) << 8)
+ ((filelength & 0x00FF0000) >> 8)
+ ((filelength & 0xFF000000) >> 24);
+ ((filelength & 0x0000FF00) << 8)
+ ((filelength & 0x00FF0000) >> 8)
+ ((filelength & 0xFF000000) >> 24);
DWORD readed=o;
ReadFile(hfile,&len,4,&readde,null);
len就是你要的头四个字节的int值。
在低字节在前(little-endian )表示的机器上,这个整数在内存的次序为 89 68 00 00
在高字节在前(big-endian )表示的机器上,这个整数在内存的次序为 00 00 68 89而int filelength =-1989672960,它的16进制正好是0x89680000
在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平台, 原理与前述类似...
short fileindex;
if((stream1 = fopen("\\Program Files\\stream.dat", "r+b" )) != NULL )
{
numread = fread( &fileindex, sizeof( short ), 1, &stream1 + 4);
}