我是一名新手程序员,只是对C中打开.dat文件有疑问。
我收到了朋友的.dat文件,这些是如何打开它的说明:
前4个字节包含一个整数 数字表示有多少 您可以扔掉的后续字节。 之后的字节包含ASCII 代码中的单个字母 信息。接下来的4个字节包含 你可以的垃圾字节数 扔掉,然后读下一个 字母等。中的最后一个字节 文件将是最后一个字母 消息。
我真的只是在寻找一种方法来查看文件的各个字节;在这一点上我很困惑......
答案 0 :(得分: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 :(得分:0)
假设你在同一类型的机器上阅读它(即两者都是big-endian或两者都是little-endian),我可能会编写类似这样的代码:
uint32_t skip;
while (fread(&skip, sizeof(skip), 1, infile)) {
fseek(infile, skip, SEEK_CUR);
putchar(fgetc(infile));
}
如果您需要处理字节问题,我可能会在写入前对数据使用htonl
,并在阅读后使用ntohl
。然而,还有很多的备选方案 - XDR和ASN.1(仅举几个例子)是针对这样的工作的(不过,我应该补充说,这两者几乎肯定是过度的手头的任务)。
答案 2 :(得分:-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].
}