【发布时间】: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()的limit在fread()分配了一个值之后。 3) 在for循环中,将<=limit更改为< limit,因为i是从零开始的,所以将其设置为limit会超出范围。 4) 请也发布正在读取的数据。 -
我在帖子中添加了它,也不是所有 11 个插槽都必须填充数据。