【发布时间】:2019-05-13 02:31:43
【问题描述】:
我正在编写一个程序,该程序使用动态分配的数组存储库存(三个数字数组)并将数组存储在名为“inventory.txt”的二进制文件中。我遇到的问题/问题是,当我打印出数组时,我在数组中得到了非常奇怪的数字。程序错误地读取二进制文件,数组的大小被读取到程序中,因为显示了正确数量的元素,并且数字不会通过多次迭代而改变。如何正确读取数字以便程序显示正确的数字??
有两个程序,第一个创建一个二进制文件“inventory.txt”并连续将三个变量part number、数量和价格放入一个动态分配的数组中,这个数组随着每个条目而增加,并在用户输入0时结束数字(只需输入一个 0)。第二个程序只是读取存储在二进制文件“inventory.txt”中的数组和数组大小,并打印“i”行以及其中存储的数字。这是两个程序。
#include <stdio.h>
#include <stdlib.h>
//THIS IS FIRST PROGRAM THAT STORES THE ARRAY BASED ON USER INPUT
int main(){
printf("This program stores an invetory: ");//declarations
int i=0, holdr, k=0;
int *pn, *q;
float *p;
q=malloc(sizeof(int));
pn=malloc(sizeof(int)); //allocate space
p=malloc(sizeof(float));
FILE *fp;
fp=fopen("inventory.txt","w+b"); //open file
while(holdr!=0){
pn=realloc(pn, (i+1) * sizeof(int)); //read data into the three arrays
q=realloc(q, (i+1) * sizeof(int));
p=realloc(p, (i+1) * sizeof(float));
printf("Please enter item data (part number, quantity, price): ");
scanf("%d,%d,%f",&pn[i],&q[i],&p[i]);
holdr=pn[i];
i++;
k++;
}
fwrite(&i,sizeof(int),1,fp); //write arrays to inventory.txt(binary)
fwrite(&pn,sizeof(int),k,fp);
fwrite(&q,sizeof(int),k,fp);
fwrite(&p,sizeof(float),k,fp);
printf("Thank you. Inventory stored in inventory.txt. \n");
fp=fopen("inventory.txt","r+b"); //Check to see if file is correct by printing from the file inside the same program.
if (fp == NULL){
printf("nah");
exit(EXIT_FAILURE);
}
for(i=0;i<k;i++){
fread(&pn,sizeof(int),k,fp); //THIS DISPLAYS THE ARRAYS CORRECTLY AS ENTERED
printf("%d\t" , pn[i]);
fread(&q,sizeof(int),k,fp);
printf("%d\t", q[i]);
fread(&p,sizeof(int),k,fp);
printf("%f\n", p[i]);}
fclose(fp);
return 0;
}
然后……
#include <stdio.h>
#include <stdlib.h>
//THE SECOND FILE THAT PRINTS OUT THE ARRAYS FROM THE FIRST PROGRAM
int main(){
FILE *fp = fopen("inventory.txt","r+b"); //declarations
if (fp == NULL){ //check file
printf("nah");
exit(EXIT_FAILURE);
}
int i;
fread(&i,sizeof(int),1,fp); //get size of arrays from "i" in the other program, THIS PART WORKS
int l,k;
int *pn, *q;
float *p;
q = (int *)malloc(i * sizeof(int)); // TODO - check malloc() OK
pn = (int *)malloc(i * sizeof(int)); // TODO - check malloc() OK
p = (float *)malloc(i * sizeof(float)); // TODO - check malloc() OK
fread( q, sizeof( int ), i, fp ); //read arrays in file into program
fread( p, sizeof( float ), i, fp );
fread( pn, sizeof( int ), i, fp );
printf("Below are the items in your inventory.\nPart#\tQuantity\tPrice\n");
for(l=0;l<i;l++){ //THIS DISPLAYS WEIRD ASS NUMBERS
printf("%d\t" , pn[l]);
printf("%d\t", q[l]);
printf("%f\n", p[l]);}
rewind(fp);
fclose(fp);
return 0;}
【问题讨论】:
-
应该
fread(&pn,sizeof(int),k,fp);是fread(&pn,sizeof(int),1,fp);吗?其他问题也存在。 -
检查您在阅读程序中的阅读顺序。如果你写成
pn, q, p,你也应该按这个顺序阅读。 -
fwrite(&pn,sizeof(int),k,fp)不应包含与号 (&)。对应的fread()调用也是如此。其他动态分配的内存也是如此。保存指向文件的指针(与指针指向的不同)然后读入通常会产生未定义的行为。