2011-04-24 89 views
1

我是新手程序员,只是有关于.dat文件中C.开幕打开.dat文件用C

我接到一个朋友.dat文件的一个问题,而这些人如何说明打开它:

前4个字节包含一个整数 数字,表示你可以有多少 后续字节扔掉。 之后的字节包含 消息中单个字母的ASCII 代码。接下来的4个字节包含 垃圾字节数,您可以丢弃 ,然后读取下一个 字母等。 文件中的最后一个字节将是 消息中的最后一个字母。

我真的只是在寻找一种方法来查看文件的单个字节;在这一点上,我很困惑...

+3

正在做作业吗? – Zabba 2011-04-24 20:41:53

+1

为什么你的“朋友”不能使用电子邮件? – 2011-04-24 20:43:25

+0

defo是功课! – Damien 2011-04-24 20:43:52

回答

2

您可以使用fread()从文件中读取字节,并从fseek()中读取字节以寻找到不同的位置(例如“丢弃字节”)。

但是,要解析第一个数字,您需要知道文件的字节顺序,除非它们实际上是代表数字的4个ASCII字符;在这种情况下,您可以使用atoi()获取号码。

下面是一些示例代码:

unsigned char buf[4]; 
FILE *fp = fopen("test.dat", "rb"); 
while(!feof(fp)) { 
    fread(buf, 4, 1, fp); // read 4 bytes 
    int throw_away = do_some_magic_to_get_the_number(buf); 
    fseek(fp, throw_away, SEEK_CUR); // skip the given number of bytes 
    fread(buf, 1, 1, fp); // read one byte 
    // your character is now in buf[0] 
} 
+1

几乎所有'while(!feof(fp))'的使用都是错误的(包括这个)。 – 2011-04-24 21:56:11

-1

退房this的文件操作是如何工作的文档。

unsigned char input buf[4]; 
FILE *fp = fopen("test.dat", "rb"); 
while(!feof(fp)) { 
    fread(buf, 4, 1, fp); 
    int skip_num = (int)buf; // should be able to cast since 4bytes = 1int and we have been told that this is an int. 
    for(; skip_num >= 0; skip_num--) {} 
    fread(buf, 1, 1, fp); // This is the actual character do something with buf[0]. 
} 
+0

你使用'while(!feof(fp))'是越野车。 – 2011-04-24 21:56:47

0

假设你在同类型的机器读这个,因为它是写在(即两者都是大端或两者都是小端),我可能会写的代码是这样的:

uint32_t skip; 

while (fread(&skip, sizeof(skip), 1, infile)) { 
    fseek(infile, skip, SEEK_CUR); 
    putchar(fgetc(infile)); 
} 

如果你需要处理的字节序的问题,我可能会使用的数据htonl写之前,并在其上ntohl看完后。然而,还有一些的替代品 - XDR和ASN.1(仅仅是一对夫妇)都是为这样的工作而设计的(尽管如此,我还要补充一点,这两项对于手头的任务而言几乎肯定是过度的) 。