fd()来自.dat文件

时间:2015-12-14 21:29:28

标签: c fopen fread

我有一个.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();

我唯一的问题就是它显示第一个条目就好了,但之后它会吃掉#34;吃掉#34;前几个字母。

编辑2

详细信息:每个sturctur变量都有几个部分。我现在也专注于城镇。 问题:只有1个城镇正确,其他的托管是空白或随机字符。

当前代码:

 #include <conio.h>
    #include <stdio.h>

    #define FILENAME "customer.dat"

    int main()
    {
    typedef struct Satz
        {
        char        town[11];
        int         costumerid[20];
        }test __attribute__((packed));

    test output[20];
    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,1,size, fp));

    for (i=0;i<limit;i++)
        {
        printf("%i\t%s\n",++j,output[i].town);
        }
    getch();
    }

控制台输出:

Limit: 11

1       Leipzig
2
3
4       ░w
5
6       hðv
7       J
8       \
9       o
10      i
11      i

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();
    }

输出:

Limit: 5

1       Leipzig
2       alle
3       rlin
4       tock
5       erin
6       us

预期产出:

1      Leipzig
2      Halle
3      Berlin
4      Rostock
5      Schwerin
6      Cottbus 

2 个答案:

答案 0 :(得分:1)

您的代码在每个循环中重新执行fopen()。有关正确使用的示例,请参阅http://www.cplusplus.com/reference/cstdio/fread/,将fopen()放在while之前,然后循环就可以了。

具体而言,您需要分配FILE*,从fopen()为其提供值,检查其是否失败,然后在FILE*来电中使用fread()。< / p>

答案 1 :(得分:0)

您发送给我的输入文件在最后一个合法条目转换回二进制文件后,xxd添加了一些额外的记录,导致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 371
The limit is 20
1   Leipzig
2   Halle
3   Berlin
4   Rostock
5   Schwerin
6   Cottbus
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20

如果没有打包属性,输出显示与您的类似。

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将导致编译器忽略&#39; packed&#39;属性。

typedef struct wetter
{
  char ort[11];
  float temp[30];
  unsigned short niederschalg[30];
  unsigned short luftdruck[30];
  float luftfeuchte[30];
}test __attribute__((packed));

此typedef不会导致编译器忽略&#39; packed&#39;属性。

typedef struct __attribute__((packed)) wetter
{
  char ort[11];
  float temp[30];
  unsigned short niederschalg[30];
  unsigned short luftdruck[30];
  float luftfeuchte[30];
}test;

对于未typedef编辑的结构,问题无法显示。