我有一个结构、一个我想读取的 txt 文件以及以下运行良好的代码。 我正在尝试创建一个函数来包含大多数读取文件函数,但似乎局部变量等存在问题。
#include <stdio.h>
#include <string.h>
int i,j,numberofseats,temp;
char platenr[8],selection,buff[60];
char firstname[20];
char lastname[20];
char phone[11];
char *p;
typedef struct
{
char fullname[40];
unsigned short phonenr[10];
unsigned int seatnr;
}PASSENGERS;
int main(void)
{
FILE *businfo;
businfo = fopen ("bus.txt","r");
if (businfo == NULL)
{
printf("Error Opening File, check if file bus.txt is present");
exit(1);
}
fscanf(businfo,"%s %d",platenr, &numberofseats);
printf("Bus Licence plate Nr is: %s and number of seats is: %d", platenr, numberofseats);
PASSENGERS passenger[numberofseats];
for (j=0;j<numberofseats;j++)
{passenger[j].seatnr=j+1;
strcpy(passenger[j].fullname,"\0");
}
while (fgets(buff,sizeof(buff),businfo))
{sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone);
strcpy(passenger[temp-1].fullname,firstname);
strcat (passenger[temp-1].fullname, " ");
strcat(passenger[temp-1].fullname,lastname);
i=0;
for (p=phone;*p!='\0';p++)
{
(passenger[temp-1].phonenr[i])=*p -'0';
i++;
}
}
因此,在代码运行之后,这就是我创建的函数,
应定义目标的位置,以更新结构
但是 *target 尚不清楚,因为它位于函数将读取的 txt 文件(临时变量)内。
这让我发疯!
void readfile( PASSENGERS *target, FILE *businfo){
while (fgets(buff,sizeof(buff),businfo))
{sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone);
strcpy(target->fullname,firstname);
strcat (target->fullname, " ");
strcat(target->fullname,lastname);
i=0;
for (p=phone;*p!='\0';p++)
{
(target->phonenr[i])=*p -'0';
i++;
}
}}
最佳答案
看看你创建的readfile函数和main函数中的纯代码之间的区别。问题是您通过在主函数中索引每个元素 (passenger[temp-1]) 来正确填充数组乘客,但每次执行 while 循环时 readfile 函数仅填充数组的第一个元素。
有两种解决方案:
第一个解决方案:函数执行后,指针 target 指向同一个元素(第一个元素)(使用 (target+temp-1)-> 填充每个元素)
void readfile( PASSENGERS *target, FILE *businfo)
{
while (fgets(buff,sizeof(buff),businfo))
{
sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone);
strcpy((target+temp-1)->fullname,firstname);
strcat ((target+temp-1)->fullname, " ");
strcat((target+temp-1)->fullname,lastname);
i=0;
for (p=phone;*p!='\0';p++)
{
((target+temp-1)->phonenr[i])=*p -'0';
i++;
}
}
}
第二种解决方案:函数执行后,指针目标指向数组中最后一个非空元素(在 while 循环末尾增加指针)
void readfile( PASSENGERS *target, FILE *businfo)
{
while (fgets(buff,sizeof(buff),businfo))
{
sscanf(buff, "%s %s %d %s", firstname, lastname, &temp,phone);
strcpy(target->fullname,firstname);
strcat (target->fullname, " ");
strcat(target->fullname,lastname);
i=0;
for (p=phone;*p!='\0';p++)
{
(target->phonenr[i])=*p -'0';
i++;
}
target = target + temp - 1;
}
}
关于c - 通过函数+结构体读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202543/