我有一个.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
答案 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
编辑的结构,问题无法显示。