C .dat文件中的fread()
我有一个C .dat文件中的fread(),c,fopen,fread,C,Fopen,Fread,我有一个.dat文件,其中包含姓名、城镇和电话号码等数据。我确实打开了文件,并在awhile循环中读取了第一行条目,但在那之后,它只会一遍又一遍地重复同样的事情。下面是一段代码: while(fread(&customer.town,1,sizeof(customer.town), fopen(input,"r" "b")) ==1 ) { printf("%i. Town...........: %s\n",i,&customer.town); } 编辑: 到
.dat
文件,其中包含姓名、城镇和电话号码等数据。我确实打开了文件,并在awhile
循环中读取了第一行条目,但在那之后,它只会一遍又一遍地重复同样的事情。下面是一段代码:
while(fread(&customer.town,1,sizeof(customer.town), fopen(input,"r" "b")) ==1 )
{
printf("%i. Town...........: %s\n",i,&customer.town);
}
编辑:
到目前为止,代码如下所示:
customer pp[3];
...
fread(pp, sizeof(customer), 9, fp);
for (i=0;i<=5;i++)
{
printf("%i\t%s\n",++j,pp[i].town);
}
getch();
2-11是随机的
编辑3
int main()
{
typedef struct Satz
{
char town[11];
}__attribute__((packed))test;
test output[30];
FILE *fp;
int size=sizeof(output[20].town);
int i=0;
int j=0;
int limit=0;
fp=fopen(FILENAME,"rb");
if (fp==NULL)
{
printf("Couldnt open the file:%s!\n", FILENAME);
getch();
return(-1);
}
printf("Limit: %i \n\n", limit=fread(output,sizeof(test),11, fp));
for (i=0;i<=limit;i++)
{
printf("%i\t%s\n",++j,output[i].town);
}
getch();
}
预期产出:
1 Leipzig
2 Halle
3 Berlin
4 Rostock
5 Schwerin
6 Cottbus
您的代码正在每个循环中重新执行
fopen()
。有关正确使用的示例,请参见,将fopen()
放在while
之前,这样循环就可以正常工作
具体来说,您需要分配一个
文件*
,从fopen()
中给它一个值,检查它是否失败,然后在fread()中使用该文件*
call.您发送给我的输入文件在最后一个合法条目后转换回二进制时,添加了一些额外的记录,导致fread()
读取14条额外的空值记录
这是我的测试代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
struct __attribute__((packed)) wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
};
struct wetter output[20];
int limits, i;
printf("The size of record is %d\n", sizeof(struct wetter));
FILE *fp=fopen("orig","r");
printf("The limit is %i\n", limits=fread(output,sizeof(struct wetter),20,fp));
for(i=0;i<limits;i++)
printf("%d\t%s\n", i+1, output[i].ort);
}
如果不打包属性,输出将显示与您类似的内容
The size of record is 372
The limit is 20
1 Leipzig
2 alle
3 rlin
4 tock
5 erin
6 us
7
8
9
10
11
12
13
14
15
16
17
18
19
20
设置属性时需要注意一点。此typedef将导致编译器忽略“packed”属性
typedef struct wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
}test __attribute__((packed));
typedef struct __attribute__((packed)) wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
}test;
此typedef不会导致编译器忽略“packed”属性
typedef struct wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
}test __attribute__((packed));
typedef struct __attribute__((packed)) wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
}test;
对于不是
typedef
ed的结构,问题不会出现。为什么要在多个位置打开文件?在多次重做后,代码变得凌乱,现在开始清理,并开始工作。在新代码中,该pp
阵列中只有3个客户,但是for
循环将索引i
取为5,因此在printf()中使用时超出了范围。即使是快速和肮脏的测试,你也应该修复它。否则,可能会得到不可预测的结果,可能包括崩溃(取决于您所做的)。@yuuki,有四条建议:1)将if(fopen(…==NULL)
更改为if(fp==NULL)
(无需再次打开,fp
有效性是您要确认的)2)添加printf()fread()赋值后的限制的
。3) 在for
循环中,change我在帖子中添加了它,也不是所有的11个插槽都必须填满数据。谢谢你的回答,我设法使它半工作,但还没有达到目标。@yuuki,代码现在是什么样子?还有,要达到你的目标还需要做什么?所以我只需要找到一种方法来忽略程序中的xxd?@yuuki-不。我必须将你发送给我的hextump转换为原始格式xxd
是一种反转hexdump的工具。这与你的努力无关。@yuuki-你算错了偏移量。您刚刚读取了左列的偏移量,但您的记录并不是从侧面打印的偏移量开始的。@yuuki-您确定要按正确的顺序将记录的大小和数量传递给fread吗?正确:fread(输出,sizeof(struct wetter),20,fp)
。错误:fread(输出,20,sizeof(struct wetter),fp)
。还没有。限制又起作用了。不知道他不喜欢什么,一个简单的代码块重启确实有帮助。可悲的是,他似乎仍然忽视了\uuuu属性
typedef struct wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
}test __attribute__((packed));
typedef struct __attribute__((packed)) wetter
{
char ort[11];
float temp[30];
unsigned short niederschalg[30];
unsigned short luftdruck[30];
float luftfeuchte[30];
}test;