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
文件,其中包含姓名、城镇和电话号码等数据。我确实打开了文件,并在a
while
循环中读取了第一行条目,但在那之后,它只会一遍又一遍地重复同样的事情。下面是一段代码:

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;