【发布时间】:2015-06-27 10:49:08
【问题描述】:
我有一个 .dat 文件需要读取并为人们打印记录 具有指定为命令行参数的属性。该文件的格式如下。每个人的记录以一个无符号的 32 位整数开头,其中包含有关此人的各种信息:
位
0-4 : 名字的长度(key=first)
5-9 : 中间名的长度 (key=middle)
10-14 : 姓氏长度 (key=last)
15-21 : 年龄 (key=age)
22:性别(0=男性,1=女性)(键=性别)
23-28 : 状态(0 到 49 按字母顺序排列)(key=state)
29 : 当前已婚 (0=false, 1=true) (key=married)
30 : 全职工作 (0=false, 1=true) (key=employed)
31 : 上过大学 (0=false, 1=true) (key=college)
我想我想先读取整个 32 位(4 个字节),然后从 32 位整数中逐位读取。我是 fread 和 fseek 的新手,所以我真的不知道我是否走在正确的轨道上,任何帮助将不胜感激。到目前为止,这是我的代码。
int main(int argc, char *argv[]) {
char *buf;
long lSize;
size_t result;
FILE *fp;
fp = fopen("/u1/junk/people.dat","r");
if(fp == NULL) {
printf("Error: can't open file to read\n");
return -1;
}
else {
printf("File people.dat opened successfully to read\n");
}
//obtian file size
fseek(fp, 0, SEEK_END);
lSize = ftell(fp);
rewind(fp);
//allocate memory to contain the whole file
buf = (char*) malloc (sizeof(char)*lSize);
while (!feof(fp)) {
fread(buf, 4, 1, fp);
fseek(fp, i, SEEK_CUR);
fread(buf, 32, 1, fp);
printf("%s\n", buf);
i+=32;
}
fclose(fp);
return 0;
}
【问题讨论】:
-
两个基本提示:不要在 C 中强制转换
malloc()的返回值,不要像这样使用feof()来检测文件结尾。 -
我觉得你应该想出一个带有位域的结构,一口气读完全部信息。
-
@facebook-100001358991487 我不同意,因为这不是可移植的实现,尽管 OP 没有提到他们是否需要可移植性。我希望看到 OP 逐个字段地填充结构。
-
@siliconwafer 为什么它不是可移植的实现?
-
@facebook-100001358991487 硅片,感谢您的建议。我不需要可移植性,位域建议听起来很棒。我现在遇到的问题是如何获取 32 位整数,然后我可以将它们与我的结构成员进行比较。
标签: c file binaryfiles fread