【问题标题】:fread() from .dat file.dat 文件中的 fread()
【发布时间】:2015-12-14 21:29:28
【问题描述】:

我有一个.dat 文件,其中包含姓名、城镇和电话号码等数据。我确实设法打开了文件并读取了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

详细信息:每个结构变量都有几个条目。我现在也只关注城镇。 问题:仅输出 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 

【问题讨论】:

  • 为什么要在多个地方打开文件?
  • 代码在多次重做后变得杂乱无章,现在开始干净,现在有点工作了。
  • 在新代码中,pp 数组中只有 3 个客户,但 for 循环将索引 i 设为 5,因此在 @ 中使用时超出范围987654333@。即使是快速而肮脏的测试,你也应该修复它。否则,可能会得到不可预知的结果,可能包括崩溃(取决于您的操作)。
  • @yuuki,四点建议:1)把if (fopen( ... == NULL)改成if (fp == NULL)(不用第二次打开,fp有效期就是你要确认的)2)添加printf()limitfread() 分配了一个值之后。 3) 在for 循环中,将&lt;=limit 更改为&lt; limit,因为i 是从零开始的,所以将其设置为limit 会超出范围。 4) 请也发布正在读取的数据。
  • 我在帖子中添加了它,也不是所有 11 个插槽都必须填充数据。

标签: c fopen fread


【解决方案1】:

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

具体来说,您需要分配一个FILE*,给它一个来自fopen() 的值,检查它是否失败,然后在您的fread() 调用中使用该FILE*

【讨论】:

  • 感谢您的回答,设法使其半工作但尚未达到目标。
  • @yuuki,现在的代码是什么样的?另外,要实现您的目标还有哪些工作要做?
【解决方案2】:

您发送给我的输入文件有一些由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 将导致编译器忽略 '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 不会导致编译器忽略 'packed' 属性。

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

对于不是typedefed 的结构,问题不会显示。

【讨论】:

  • 所以我只需要想办法忽略程序中的xxd?
  • @yuuki - 不。我必须将您发送给我的 hexdump 转换为原始格式。 xxd 是一个反转 hexdump 的工具。这与你的努力无关。
  • @yuuki - 你算错了偏移量。您刚刚阅读了左列的偏移量,但您的记录并没有完全从侧面打印的偏移量开始。
  • @yuuki - 你确定你以正确的顺序传递记录的大小和数量来 fread 吗?正确:fread(output,sizeof(struct wetter),20,fp)。错误:fread(output, 20, sizeof(struct wetter),fp).
  • 还没有。限制再次起作用。不知道他不喜欢什么,简单的代码块重启确实有所帮助。可悲的是,他似乎仍然忽略了__attribute__
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2015-11-27
相关资源
最近更新 更多