C freads必须遵守秩序吗?
因此,我正在为一个程序编写一个代码,该程序有多个菜单,将不同的结构数据写入一个文件,然后有另一个菜单显示写入这些文件的数据。以下是菜单的代码:C freads必须遵守秩序吗?,c,file-io,C,File Io,因此,我正在为一个程序编写一个代码,该程序有多个菜单,将不同的结构数据写入一个文件,然后有另一个菜单显示写入这些文件的数据。以下是菜单的代码: void displayall() { FILE *fp; int choice=0; struct depart loc = {0}; struct arrive loc1 = {0}; struct travel trav = {0}; fp=fopen("traveldat.dat","r");
void displayall()
{
FILE *fp;
int choice=0;
struct depart loc = {0};
struct arrive loc1 = {0};
struct travel trav = {0};
fp=fopen("traveldat.dat","r");
while (1)
{
fread(&loc,sizeof(loc),1,fp);
fread(&loc1,sizeof(loc1),1,fp);
fread(&trav,sizeof(trav),1,fp);
double distance,time;
distance = sqrt(pow((loc1.x2-loc.x1),2)+pow((loc1.y2-loc.y1),2));
time = distance/trav.spd;
if (feof(fp))
{
break;
}
printf("\tYour departure location is : %s\n",loc.dep);
printf("\tWith the x-coordinate : %.2f\n",loc.x1);
printf("\tAnd the y-coordinate : %.2f\n\n",loc.y1);
printf("\tYour destination location is : %s\n",loc1.dest);
printf("\tWith the x-coordinate : %.2f\n",loc1.x2);
printf("\tAnd the y-coordinate : %.2f\n\n",loc1.y2);
printf("\tThe distance between these two locations is : %.2fkm\n\n",distance);
printf("\tYour preferred travel method is : %s\n",trav.mthd);
printf("\tWhich has a top speed of : %.2f km/h\n\n",trav.spd);
printf("\tYour expected travel time is : %.2f hours*\n\n",time);
printf("\t*Estimation,actual travel times may vary depending on certain conditions\n\n");
printf("\tThe system will now display the Main Menu\n\n");
}
fclose(fp);
}
我面临的问题是,如果我在写入loc的菜单之前进入写入loc1或trav的菜单,则显示菜单不工作,返回主菜单,然后在我尝试访问它时拒绝打开。是因为fread(&loc)放在其他fread之前吗?还是我遗漏了什么?如果这段代码碍眼或者我问错了,我会提前道歉,因为我只学了一个月的编程
按要求编辑:loc1和loc代码
void arrival_location_menu()
{
FILE *fp;
int choice=0;
struct arrive loc1;
fp=fopen("traveldat.dat","a");
printf("Please select your option (Destination location)\n");
printf("1.HOME\n");
printf("2.Andromeda Galaxy\n");
printf("3.The Library\n");
printf("4.Cprogramming.com\n");
printf("5.Return to main menu\n");
scanf("%d",&choice);
fflush (stdin);
switch (choice)
{
case 1: loc1.x2 = 3750;
loc1.y2 = 3450;
loc1.dest = "HOME";
system("CLS");
break;
case 2: loc1.x2 = 9870;
loc1.y2 = 5660;
loc1.dest = "Andromeda Galaxy";
system("CLS");
break;
case 3: loc1.x2 = 1367;
loc1.y2 = 3123;
loc1.dest = "The Library";
system("CLS");
break;
case 4: loc1.x2 = 2133;
loc1.y2 = 4767;
loc1.dest = "stackoverflow.com";
system("CLS");
break;
case 5: system("CLS");
break;
default: printf("Invalid option! Returning you to main menu...\n");
}
fwrite(&loc1,sizeof(loc1),1,fp);
fclose(fp);
return;
}
//DEPARTURE MENU
void departure_location_menu()
{
FILE *fp;
int choice=0;
struct depart loc;
fp=fopen("traveldat.dat","w");
printf("Please select your option (Departure location)\n");
printf("1.UTAR\n");
printf("2.PLUTO\n");
printf("3.IDK\n");
printf("4.UMM\n");
printf("5.Return to main menu\n");
scanf("%d",&choice);
fflush (stdin);
switch (choice)
{
case 1: loc.x1 = 1738;
loc.y1 = 1997;
loc.dep = "UTAR";
system("CLS");
break;
case 2: loc.x1 = 9850;
loc.y1 = 5675;
loc.dep = "PLUTO";
system("CLS");
break;
case 3: loc.x1 = 1363;
loc.y1 = 3125;
loc.dep = "IDK";
system("CLS");
break;
case 4: loc.x1 = 2130;
loc.y1 = 4785;
loc.dep = "UMM";
system("CLS");
break;
case 5:
system("CLS");
break;
default: printf("Invalied option!\n");
}
fwrite(&loc,sizeof(loc),1,fp);
fclose(fp);
return;
}
您似乎在问是否可以从文件中的任何位置读取数据。是的,你可以 有一个函数用来调整文件指针。文件指针是下一次读取或写入的位置 还有一个函数被调用来读取当前文件指针。如果要更改文件指针并希望稍后恢复它,这一点很重要 我还建议您养成初始化变量的习惯(即使它是NULL或零),并检查函数返回值。这两件简单的事情可以使调试简单得多
我相信user@m-m已经解释了编码逻辑错误。您似乎在问是否可以从文件中的任何位置读取数据。是的,你可以 有一个函数用来调整文件指针。文件指针是下一次读取或写入的位置 还有一个函数被调用来读取当前文件指针。如果要更改文件指针并希望稍后恢复它,这一点很重要 我还建议您养成初始化变量的习惯(即使它是NULL或零),并检查函数返回值。这两件简单的事情可以使调试简单得多
我相信user@m-m已经解释了编码逻辑错误。你的帖子不清楚,但是你是在同一个文件已经打开准备写入的时候读取这个文件的吗?如果你在
loc
之前写入loc1
,并且没有指定loc1
的偏移量,那么它将在loc
之前。你能给我们看一下写loc1
和loc
的代码吗;相反,您应该检查所有三个fread
是否成功为什么假设最快的距离是一条直线?极坐标,曼哈顿几何?对不起,你是在问为什么写loc
,然后写trav
,然后写loc1
;但是读入loc
,然后读入loc1
,然后读入trav
?从你的帖子上看不清楚,但是,当同一个文件已经打开准备写入时,您是否正在读取该文件?如果您在loc
之前写入loc1
,并且没有为loc1
指定偏移量,那么它将在loc
之前。你能给我们看一下写loc1
和loc
的代码吗;相反,您应该检查所有三个fread
是否成功为什么假设最快的距离是一条直线?极坐标,曼哈顿几何?对不起,你是在问为什么写loc
,然后写trav
,然后写loc1
;但是读入loc
,然后读入loc1
,然后读入trav
??