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
??