【发布时间】:2011-06-15 17:39:22
【问题描述】:
我需要编写一个程序,它只是一个测量转换程序。 程序首先向用户询问二进制文件的名称(单位转换数据),打开文件,设置数组。
我的结构:
struct unit {
char name[NAME_LEN];
char abbrev[ABBREV_LEN];
char class[CLASS_LEN];
double standard;
};
和我的功能:
int fread_units(int unit_max,struct unit units[], int *unit_sizep)
{
FILE *filep;
struct unit data;
int i, status;
char fullname[10];
/* Gets database of units from file */
printf("Enter name of binary file> ");
scanf("%s", fullname);
strcat(fullname, ".bin");
i = 0;
filep = fopen(fullname, "rb");
//fseek (filep , 0 , SEEK_END);
for (status = fread(&data, sizeof( struct unit ), 1, filep);
status == 1 && i < unit_max;
status = fread(&data, sizeof( struct unit ), 1, filep)){
units[i++] = data;
}
printf("\n%f", units[3].standard);
/* Issue error message on premature exit */
if (status == 0) {
printf("\n*** Error in data format ***\n");
printf("*** Using first %d datavalues ***\n",i);
}
else if (status != EOF) {
printf("\n*** Error: too much data in file ***\n");
printf("*** Using first %d data values ***\n", i);
}
/* Send back size of used portion of array */
*unit_sizep = i;
if(status == 4)
status = 1;
else if (status != EOF)
status = 0;
fclose(filep);
return(status);
}
根据书中的说法,(fread(&data, sizeof( struct unit ), 1, filep);) 足以将所有数据存储到一个结构中。
但这对我不起作用...
输出:
*** Error in data format ***
*** Using first 4 datavalues ***
To convert 25 kilometers to miles, you would enter
> 25 kilometers miles
or, alternatively,
> 25 km mi
> 25 km mi
Attempting conversion of 25.0000 km to mi . . .
Unit kmnot in database
Enter a conversion problem or q to quit.
>
我的units.bin文件;
miles mi distance 1609.3
kilometers km distance 1000
yards yd distance 0.9144
meters m distance 1
quarts qt liguid_volume 0.94635
liters l liquid_volume 1
gallons gal liquid_volume .7854
millimeters ml liquid_volume 0.001
kilograms kg mass 1
grams g mass 0.001
slugs slugs mass 0.14594
【问题讨论】:
-
等等,你的units.bin文件是text文件吗?
standard字段是如何真正保存的? -
你的结构说最后一个字段是
double,但你的文件包含一个数字的文本表示!您必须执行其他操作才能读取文本数字,然后将其转换为实际的双精度数。 -
如何创建一个二进制文件来处理它?
-
好吧 - 如果您对格式化的文本文件感到满意,您应该查看 fscanf() 进行格式化读取,而不是 fread()。
-
如果你解决了你的问题,你应该把你的解决方案放在一个答案中并接受它。最好说明您需要进行哪些更改才能解决您的问题。
标签: c arrays structure binaryfiles