fread的一些用法存疑,百分
fread 把读出来的东西写进去缓冲区,如果缓冲区开辟的是char* 假设读出来的是"莙鈦" 我似乎不能用atoi得到它所对应的文件中的十六进制数(atoi的结果是0),为了能处理和识别"莙鈦"所对应的十六进制数c7 71 e2 81 我是不是只能定义unsigned int*来存储文件中读出来的东西? 由于定义数字没有定义char[]这样灵活(char一个只占用1)当我fread的时候,似乎只能用许多占用4、5、6字节的文件中的数据装入int* unsigned long*等等之中,请问,用一个结构 把整个块的数据装进去是否会比许多fread 合力填充一个结构效率高呢?似乎肯定是后者效率高些
另外我这样的结构:The CPIO Header uses the following header structure (sometimes referred to as "new ASCII" or "SVR4 cpio"). All numbers are stored as ASCII representations of their hexadecimal value with leading zeros as needed to fill the field. With the exception of c_namesize and the corresponding name string, and c_checksum, all information contained in the CPIO Header is also represented in the Header Section. The values in in the CPIO Header must match the values contained in the Header Section.
struct {
char c_magic[6];
char c_ino[8];
char c_mode[8];
char c_uid[8];
char c_gid[8];
char c_nlink[8];
char c_mtime[8];
char c_filesize[8];
char c_devmajor[8];
char c_devminor[8];
char c_rdevmajor[8];
char c_rdevminor[8];
char c_namesize[8];
char c_checksum[8];
};
想要把 char c_filesize[8], char c_namesize[8] , char c_checksum[8];等部分这样size的数据,按照文件中存储的十六进制数据及从文件便宜0x0处开始读取出来,填充入结构并且以16进制的形式处理,请问我该如何写fread()呢?(必要的话可以改动结构的定义,但是不能改动文件的定义和原定以结构体中每个成员的size和对应文件中的位置)
谢谢!!
问题点数:100、回复次数:8Top
1 楼du51(郁郁思扬)回复于 2006-07-03 02:24:25 得分 5
wchar_tTop
2 楼yingge(...木脑壳...)回复于 2006-07-03 04:39:01 得分 10
把这样c7 71 e2 81的数放到char[]里面,然后变成整数,为什么还要atoi啊,atoi是把字符串转换成整数啊。用memcpy就可以了
#include <stdio.h>
#include <string.h>
int main(){
FILE *fp;
char s[4];
int i,j;
fp=fopen("input.file","rb");
fread(s,4,1,fp);
fclose(fp);
fp=fopen("input.file","rb");
fread(&i,1,4,fp);
fclose(fp);
memcpy(&j,s,4);
if(i==j){
printf("Equals...\n");
}
return 0;
}
Top
3 楼Silenthunter(爱XX 爱XX)回复于 2006-07-05 12:01:32 得分 0
如果一个文件里面的待处理的一块的size比较大有11,这个表示了文件大小的数字,那么即使我能够用char[11] 把它读出来,又应该如何去处理这个数字呢? 谢谢!Top
4 楼wzzww(无知者无畏)(此人已死)回复于 2006-07-05 13:01:04 得分 0
你文件的内容是什么?
是0xc7 71 e2 81 吗?
0xc7 71 e2 81 不就是一个int吗?
弄不懂你的问题,帮不上忙Top
5 楼dreamXren(追梦人)回复于 2006-07-05 13:30:09 得分 0
lz描述问题都不清楚,汗~~~~
char size[4]; //0xc7 71 e2 81
long realsize = (long)*(long*)size;
要注意一般文件存放数据的都是按网络字节流顺序存放的(大端),
Intel处理器是小端,注意转序。
那么即使我能够用char[11] 把它读出来
------------------------------------
这是什么文件,有这么大?size占4个字节,最大就是4G的文件。除非是BCD码Top
6 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-05 15:02:14 得分 15
如果缓冲区开辟的是char* 假设读出来的是"莙鈦" 我似乎不能用atoi得到它所对应的文件中的十六进制数(atoi的结果是0)
================
atoi 要求参数是 ansi 字符串 ...
你的串显然不是,
自然不能的到正确的结果 ...
用 wchar_t 吧,支持 unicode ...Top
7 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-05 15:08:04 得分 70
为了能处理和识别"莙鈦"所对应的十六进制数c7 71 e2 81 我是不是只能定义unsigned int*来存储文件中读出来的东西
============
这个看你怎么处理了,
也不是唯一的 ...
例如你定义若干个 char:
char string[] = {0xc7, 0x71, 0xe2, 0x81, 0};
int i;
puts(string); //输出的是 莙鈦
for(i=0; i<strlen(string); i++)
printf("%x ", string[i]&0xff); //输出 c7 71 e2 81 ,string[i]&0xff是控制位数
...
Top
8 楼dreamXren(追梦人)回复于 2006-07-06 10:43:29 得分 0
lz你也太..................................毒了点吧!Top




