我有一个文本文件,其中包含我创建的默认数据。现在,我想将它们放入我的数组中。但是没有成功。我不知道为什么只有结构数据的第一条记录可以存储在我的数组中。
我想将前9条记录存储在Arr [0]中,将第二条9条记录存储在Arr [1]中 ,而第三个9记录存储在Arr [2]中,但结果只有recordNum可以存储在Arr [I]中。
如果您能帮助我,我会非常感激并为您感到骄傲,因为我尝试了很多次都无法成功
这是我的数据文件内容:
1001 - bric - 1 - human - 10 - 70.00 - Eric - home - arrive
1002 - She - 1 - human - 10 - 50.00 - she - home - arrive
1003 - She - 2 - human - 10 - 120.00 - Eric - home - arrived
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
struct record{
char recordnum [40];
char itemrecord [40];
char quantity [40];
char weight [40];
char itemname [40];
char catagory [40];
char recipient [40];
char final_destination [40];
char status [40];
};
int main(){
FILE *fileptr1, *fileptr2, fileptr3;
char filename[40]="data.txt";
int save;
char delete_num ;
char reply;
int n=1 , i=0;
#define MAX 9
struct record Arr[MAX];
printf("Enter file name: ");
scanf("%s", filename);
//open file in read mode
fileptr1 = fopen(filename, "r");
if (fileptr1== NULL){
printf("open unsuccessful,file not exist");
exit(1);
}
while(n>0){
n=fscanf(fileptr1,"%s %s %s %s %s %s %s %s %s",Arr[i].recordnum,
Arr[i].itemname, Arr[i].itemrecord, Arr[i].catagory, Arr[i].quantity,
Arr[i].weight, Arr[i].recipient, Arr[i].final_destination,
Arr[i].status );
i++;
}
n=i;
for(i=0; i<n-1 ;i++){
printf("%s \n" ,Arr[i]);
}
fclose(fileptr1);
return 0;
}
结果:
Enter file name: data.txt
1001
1002
1003
答案 0 :(得分:1)
printf函数的"%s"
格式用于字符串。
c中的字符串表示为一维数组(或指向内存一部分的指针),其中包含字符,并以“ \ 0”字符结尾。
在这里,您尝试以这种格式打印类型为struct record
的变量,该变量的行为未定义,在您的示例中,碰巧Arr + i
所指向的字节(即值的地址) Arr[i]
类型的struct record
是Arr[i].recordnum
的{{1}},因此,因为您告诉printf使用"%s"
格式将这些字节视为字符串,所以打印字符直到{{ 1}}个字符被满足。但是,这是未定义的行为,因为根据体系结构,结构的开头可能会有填充字节,而不是其第一个字段的字节。
没有可用于打印自定义结构的printf格式,因此在您的情况下,'\0'
您需要使用各自的格式手动打印每个结构域。
%s