如何将二进制文件中的结构写入另一个二进制文件中的嵌套结构?
How can I write a struct from a binary file to a nested struct in another binary file?
我有这个代码。假设我想 link 航班 1(使用函数 InputFlight 生成)到用户 1(使用函数 InputUser 生成)。
注意:结构体 user 有另一个嵌套结构体 booking ,它有一个名为 flight.
的嵌套结构
通过在二进制文件中移动指针,我所做的就是:
向用户询问航班号(假设是第一个航班)-> 所以我转到第一个航班。
询问用户他是哪个用户(假设是第一个用户)-> 所以我转到第一个用户。
然后通过 fread() 和 fwrite(),我尝试复制结构 [= 中的内容45=]flight 进入 travelers.b.list,但不知何故它不起作用。
我已经尝试了一切。我尝试更改 fwrite() 和 fseek() 中的参数但没有成功。我想主要问题出在 booking.h 里面的 checkin() 函数,但我似乎无法解决它。
main.c
#include <stdio.h>
#include <stdlib.h>
#include "flight.h"
#include "user.h"
void login_admin();
int main() {
setbuf(stdout, NULL);
login_admin();
return 0;
}
void login_admin() {
FILE *file;
FILE *file1;
unsigned short int userchoice1 = 0;
unsigned short int s = 0;
while (s != 1) {
printf("\n-------------- M E N U --------------");
printf("\n----- A D M I N I S T R A T O R -----");
printf("\n1) Insert user");
printf("\n2) Insert flight");
printf("\n3) Check-in");
printf("\n9) Exit program");
printf("\n-------------------------------------");
printf("\nYOUR CHOICE: ");
scanf("%hu", &userchoice1);
if (s != getchar()) {
}
switch (userchoice1) {
case 1:
inputUser(file);
break;
case 2:
inputFlight(file);
break;
case 3:
checkin(file, file1);
break;
case 9:
s = 1;
exit(0);
break;
default:
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\nValue not valid.");
break;
}
}
}
booking.h
#include <stdio.h>
typedef struct {
flight list;
char booking_code[MAX_BOOKING_CODE];
} booking; //struct booking
typedef struct {
char name[MAX_NAME];
char surname[MAX_SURNAME];
date date_of_birth;
char place_of_birth[MAX_PLACE_OF_BIRTH];
char passport_number[MAX_PASSPORT];
booking b;
} user; //struct user
void checkin(FILE *flights, FILE *users) {
flight list;
user travelers;
int user_number = 0;
int choice = 0;
int choice1= 0;
if( (users = fopen("users.dat", "rb") ) == NULL) {
printf("Error.(1)");
}
else
{
printf("\nWhat's your user number?");
printf("\nUSER NUMBER: ");
scanf("%d", &user_number);
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fread(&travelers, 1, sizeof(user), users);
if( (flights = fopen("flights.dat", "rb") ) == NULL) {
printf("Error.");
}
else {
printf("Available flights:\n\n");
flights = fopen("flights.dat", "rb");
while( !(feof(flights)))
{
int read = fread(&list, 1, sizeof(flight), flights);
if ( read > 0) {
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
list.flight_code, list.companyname, list.departure,
list.arrival, list.plane_code, list.date_of_flight.day,
list.date_of_flight.month, list.date_of_flight.year, list.hour_departure,
list.minute_departure,list.hour_arrival,list.hour_departure, list.flight_time);
}
}
printf("Which flight you want to choose?\n");
printf("YOUR CHOICE: ");
scanf("%d", &choice1);
fseek(flights, (choice1-1)*sizeof(flight), SEEK_SET);
fread(&list, 1, sizeof(flight), flights);
printf("\n--------YOU CHOSE FLIGHT %d-------- \n\n", choice1);
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
list.flight_code, list.companyname, list.departure,
list.arrival, list.plane_code, list.date_of_flight.day,
list.date_of_flight.month, list.date_of_flight.year, list.hour_departure,
list.minute_departure,list.hour_arrival,list.hour_departure, list.flight_time);
users = fopen("users.dat", "rb+");
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers.b.list, 1, sizeof(user), users);
fclose(users);
fclose(flights);
flight.h
#include <stdio.h>
#include "define.h"
typedef struct {
unsigned short int day;
unsigned short int month;
unsigned short int year;
} date; //struct date
typedef struct {
char flight_code[MAX_FLIGHT_CODE];
char companyname[MAX_COMPANY_NAME];
char departure[MAX_DEPARTURE];
char arrival[MAX_ARRIVAL];
char plane_code[MAX_PLANE_CODE];
unsigned short int seats[MAX_SEATS];
date date_of_flight;
unsigned short int hour_departure;
unsigned short int minute_departure;
unsigned short int hour_arrival;
unsigned short int minute_arrival;
unsigned short int flight_time;
} flight; //struct flight
void inputFlight(FILE *flight_file);
void inputFlight(FILE *flight_file) {
flight list;
static int i = 0;
//for (int i = 0; i < 20; i++) {
flight_file = fopen("flights.dat","wb");
printf("Flight code %d: ", i+1);
scanf("%6s", list.flight_code);
fflush(stdin);
printf("Company name of flight %d: ", i+1);
scanf("%19s", list.companyname);
fflush(stdin);
printf("DEPARTURE: ");
scanf("%19s", list.departure);
fflush(stdin);
printf("ARRIVAL: ");
scanf("%19s", list.arrival);
fflush(stdin);
printf("Plane code of flight %d: ", i+1);
scanf("%4s", list.plane_code);
fflush(stdin);
printf("Day of flight %d: ", i+1);
scanf("%hu", &list.date_of_flight.day);
fflush(stdin);
printf("Month of flight %d: ", i+1);
scanf("%hu", &list.date_of_flight.month);
fflush(stdin);
printf("Year of flight %d: ", i+1);
scanf("%hu", &list.date_of_flight.year);
fflush(stdin);
printf("Hour and minutes of departure flight %d (separated by spacebar): ", i+1);
scanf("%hu%hu", &list.hour_departure, &list.minute_departure);
fflush(stdin);
printf("Hour and minutes of arrival flight %d (separated by spacebar): ", i+1);
scanf("%hu%hu", &list.hour_arrival, &list.minute_arrival);
fflush(stdin);
printf("Flight time: ");
scanf("%hu", &list.flight_time);
fflush(stdin);
fwrite(&list, 1, sizeof(flight), flight_file);
fclose(flight_file);
//}
}
user.h
#include <stdio.h>
#include <stdlib.h>
#include "booking.h"
void inputUser(FILE *input);
void inputUser(FILE *input) {
if( (input = fopen("users.dat", "wb") ) == NULL) {
printf("Error.");
}
else {
user travelers;
static int i = 0;
//for (int p = 0; p < 3; p++) {
printf("Name user %d: ", i+1);
scanf("%19s", travelers.name);
fflush(stdin);
printf("Surname user %d: ", i+1);
scanf("%19s", travelers.surname);
fflush(stdin);
printf("Day of birth user %d: ", i+1);
scanf("%hu", &travelers.date_of_birth.day);
fflush(stdin);
printf("Month of birth user %d: ", i+1);
scanf("%hu", &travelers.date_of_birth.month);
fflush(stdin);
printf("Year of birth user %d: ", i+1);
scanf("%hu", &travelers.date_of_birth.year);
fflush(stdin);
printf("Place of birth user %d: ", i+1);
scanf("%9s", travelers.place_of_birth);
fflush(stdin);
printf("Passport number user %d: ", i+1);
scanf("%8s", travelers.passport_number);
fflush(stdin);
fwrite(&travelers, 1, sizeof(user), input);
i++;
//}
fclose(input);
}
}
define.h
#ifndef DEFINE_H_
#define DEFINE_H_
#define MAX_NAME 20
#define MAX_SURNAME 20
#define MAX_PASSPORT 9
#define MAX_PLACE_OF_BIRTH 15
#define MAX_FLIGHT_CODE 6
#define MAX_COMPANY_NAME 20
#define MAX_DEPARTURE 20
#define MAX_ARRIVAL 20
#define MAX_PLANE_CODE 5
#define MAX_SEATS 150
#define MAX_BOOKING_CODE 5
#endif /* DEFINE_H_ */
预期结果是struct list,通过fseek()[=67=寻找(基本选择) ] 在函数 checkin() 中应该保存在结构 travelers.b.list 中,而所有当我尝试打印它时,我得到的是各种符号等的混合。
我希望我已经为您弄清楚了所有内容,对于格式不正确等问题,我深表歉意
这对我来说是一个非常大的大学项目,我希望有人能帮助我。
谢谢。
在你写的inputUser中做
fwrite(&travelers, 1, sizeof(user), input);
这样做似乎更符合逻辑
fwrite(&travelers, sizeof(user), 1, input);
因为fwrite是
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
而不是
size_t fwrite(const void *ptr, size_t nmemb, size_t size,
FILE *stream);
当然在其他地方也是一样的,比如checkIn,对于fread你也交换nmemb 和 尺寸
注意 checkin 你做了两次 flights = fopen("flights.dat", "rb")
:
if( (flights = fopen("flights.dat", "rb") ) == NULL) {
printf("Error.");
}
else {
printf("Available flights:\n\n");
flights = fopen("flights.dat", "rb");
因为你用了同一个变量flights只有第二个FILE可以关闭。一段时间后您将无法再次打开文件,因为同时打开的文件数量有限。
警告
while( !(feof(flights)))
一般does not work,使用fread的结果停止读取
您可以删除所有 fflush(stdin);
,它们什么都不做 :
For input streams associated with seekable files (e.g., disk files,
but not pipes or terminals), fflush() discards any buffered data ...
我鼓励您检查 scanf 的结果以确保输入的内容有效,因此在读取值时检查 returns 1 并且2 你读到的几个案例 2 个值
也在
scanf("%d", &user_number);
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fread(&travelers, 1, sizeof(user), users);
和
scanf("%d", &choice1);
fseek(flights, (choice1-1)*sizeof(flight), SEEK_SET);
fread(&list, 1, sizeof(flight), flights);
根本没有检查
所以你不知道你读到了什么,你假设为 user_number
和 choice1
输入了一个有效的 int,你假设它们的值是兼容的与文件的大小,然后你假设你可以读取 user/fligh
您确实需要添加支票
I guess the main problem is in the function checkin() inside booking.h
是的,在checkin你修改用户航班部分的方式不对,你这样做
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers.b.list, 1, sizeof(user), users);
fseek设置文件中用户开头的位置,而不是fwrite 所有用户你 fwrite 子部分 travelers.b.list
所以你替换 name/surname/...通过航班(以及它之后的内存,因为你写的是用户的大小而不是航班的大小)而且没有初始化,因为之前你 fread 在变量 list 而不是 travelers.b.list
.
更正的方法是更新travelers.b.list
然后写入所有用户,所以要替换
fread(&list, 1, sizeof(flight), flights);
printf("\n--------YOU CHOSE FLIGHT %d-------- \n\n", choice1);
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
list.flight_code, list.companyname, list.departure,
list.arrival, list.plane_code, list.date_of_flight.day,
list.date_of_flight.month, list.date_of_flight.year, list.hour_departure,
list.minute_departure,list.hour_arrival,list.hour_departure, list.flight_time);
users = fopen("users.dat", "rb+");
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers.b.list, 1, sizeof(user), users);
来自
fread(&travelers.b.list, sizeof(flight), 1, flights);
printf("\n--------YOU CHOSE FLIGHT %d-------- \n\n", choice1);
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
travelers.b.list.flight_code, travelers.b.list.companyname, travelers.b.list.departure,
travelers.b.list.arrival, travelers.b.list.plane_code, travelers.b.list.date_of_flight.day,
travelers.b.list.date_of_flight.month, travelers.b.list.date_of_flight.year, travelers.b.list.hour_departure,
travelers.b.list.minute_departure,travelers.b.list.hour_arrival,travelers.b.list.hour_departure, travelers.b.list.flight_time);
users = fopen("users.dat", "rb+");
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers, sizeof(user), 1, users);
另一种更接近您的代码的方法是在正确的位置 fseek 并以正确的大小编写正确的航班,以便替换
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers.b.list, 1, sizeof(user), users);
来自
fseek(users, (user_number-1)*sizeof(user) + (((char *) &travelers.b.list) - ((char *) &travelers)), SEEK_SET);
fwrite(&list, sizeof(list), 1, users);
我有这个代码。假设我想 link 航班 1(使用函数 InputFlight 生成)到用户 1(使用函数 InputUser 生成)。 注意:结构体 user 有另一个嵌套结构体 booking ,它有一个名为 flight.
的嵌套结构通过在二进制文件中移动指针,我所做的就是:
向用户询问航班号(假设是第一个航班)-> 所以我转到第一个航班。
询问用户他是哪个用户(假设是第一个用户)-> 所以我转到第一个用户。
然后通过 fread() 和 fwrite(),我尝试复制结构 [= 中的内容45=]flight 进入 travelers.b.list,但不知何故它不起作用。
我已经尝试了一切。我尝试更改 fwrite() 和 fseek() 中的参数但没有成功。我想主要问题出在 booking.h 里面的 checkin() 函数,但我似乎无法解决它。
main.c
#include <stdio.h>
#include <stdlib.h>
#include "flight.h"
#include "user.h"
void login_admin();
int main() {
setbuf(stdout, NULL);
login_admin();
return 0;
}
void login_admin() {
FILE *file;
FILE *file1;
unsigned short int userchoice1 = 0;
unsigned short int s = 0;
while (s != 1) {
printf("\n-------------- M E N U --------------");
printf("\n----- A D M I N I S T R A T O R -----");
printf("\n1) Insert user");
printf("\n2) Insert flight");
printf("\n3) Check-in");
printf("\n9) Exit program");
printf("\n-------------------------------------");
printf("\nYOUR CHOICE: ");
scanf("%hu", &userchoice1);
if (s != getchar()) {
}
switch (userchoice1) {
case 1:
inputUser(file);
break;
case 2:
inputFlight(file);
break;
case 3:
checkin(file, file1);
break;
case 9:
s = 1;
exit(0);
break;
default:
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\nValue not valid.");
break;
}
}
}
booking.h
#include <stdio.h>
typedef struct {
flight list;
char booking_code[MAX_BOOKING_CODE];
} booking; //struct booking
typedef struct {
char name[MAX_NAME];
char surname[MAX_SURNAME];
date date_of_birth;
char place_of_birth[MAX_PLACE_OF_BIRTH];
char passport_number[MAX_PASSPORT];
booking b;
} user; //struct user
void checkin(FILE *flights, FILE *users) {
flight list;
user travelers;
int user_number = 0;
int choice = 0;
int choice1= 0;
if( (users = fopen("users.dat", "rb") ) == NULL) {
printf("Error.(1)");
}
else
{
printf("\nWhat's your user number?");
printf("\nUSER NUMBER: ");
scanf("%d", &user_number);
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fread(&travelers, 1, sizeof(user), users);
if( (flights = fopen("flights.dat", "rb") ) == NULL) {
printf("Error.");
}
else {
printf("Available flights:\n\n");
flights = fopen("flights.dat", "rb");
while( !(feof(flights)))
{
int read = fread(&list, 1, sizeof(flight), flights);
if ( read > 0) {
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
list.flight_code, list.companyname, list.departure,
list.arrival, list.plane_code, list.date_of_flight.day,
list.date_of_flight.month, list.date_of_flight.year, list.hour_departure,
list.minute_departure,list.hour_arrival,list.hour_departure, list.flight_time);
}
}
printf("Which flight you want to choose?\n");
printf("YOUR CHOICE: ");
scanf("%d", &choice1);
fseek(flights, (choice1-1)*sizeof(flight), SEEK_SET);
fread(&list, 1, sizeof(flight), flights);
printf("\n--------YOU CHOSE FLIGHT %d-------- \n\n", choice1);
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
list.flight_code, list.companyname, list.departure,
list.arrival, list.plane_code, list.date_of_flight.day,
list.date_of_flight.month, list.date_of_flight.year, list.hour_departure,
list.minute_departure,list.hour_arrival,list.hour_departure, list.flight_time);
users = fopen("users.dat", "rb+");
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers.b.list, 1, sizeof(user), users);
fclose(users);
fclose(flights);
flight.h
#include <stdio.h>
#include "define.h"
typedef struct {
unsigned short int day;
unsigned short int month;
unsigned short int year;
} date; //struct date
typedef struct {
char flight_code[MAX_FLIGHT_CODE];
char companyname[MAX_COMPANY_NAME];
char departure[MAX_DEPARTURE];
char arrival[MAX_ARRIVAL];
char plane_code[MAX_PLANE_CODE];
unsigned short int seats[MAX_SEATS];
date date_of_flight;
unsigned short int hour_departure;
unsigned short int minute_departure;
unsigned short int hour_arrival;
unsigned short int minute_arrival;
unsigned short int flight_time;
} flight; //struct flight
void inputFlight(FILE *flight_file);
void inputFlight(FILE *flight_file) {
flight list;
static int i = 0;
//for (int i = 0; i < 20; i++) {
flight_file = fopen("flights.dat","wb");
printf("Flight code %d: ", i+1);
scanf("%6s", list.flight_code);
fflush(stdin);
printf("Company name of flight %d: ", i+1);
scanf("%19s", list.companyname);
fflush(stdin);
printf("DEPARTURE: ");
scanf("%19s", list.departure);
fflush(stdin);
printf("ARRIVAL: ");
scanf("%19s", list.arrival);
fflush(stdin);
printf("Plane code of flight %d: ", i+1);
scanf("%4s", list.plane_code);
fflush(stdin);
printf("Day of flight %d: ", i+1);
scanf("%hu", &list.date_of_flight.day);
fflush(stdin);
printf("Month of flight %d: ", i+1);
scanf("%hu", &list.date_of_flight.month);
fflush(stdin);
printf("Year of flight %d: ", i+1);
scanf("%hu", &list.date_of_flight.year);
fflush(stdin);
printf("Hour and minutes of departure flight %d (separated by spacebar): ", i+1);
scanf("%hu%hu", &list.hour_departure, &list.minute_departure);
fflush(stdin);
printf("Hour and minutes of arrival flight %d (separated by spacebar): ", i+1);
scanf("%hu%hu", &list.hour_arrival, &list.minute_arrival);
fflush(stdin);
printf("Flight time: ");
scanf("%hu", &list.flight_time);
fflush(stdin);
fwrite(&list, 1, sizeof(flight), flight_file);
fclose(flight_file);
//}
}
user.h
#include <stdio.h>
#include <stdlib.h>
#include "booking.h"
void inputUser(FILE *input);
void inputUser(FILE *input) {
if( (input = fopen("users.dat", "wb") ) == NULL) {
printf("Error.");
}
else {
user travelers;
static int i = 0;
//for (int p = 0; p < 3; p++) {
printf("Name user %d: ", i+1);
scanf("%19s", travelers.name);
fflush(stdin);
printf("Surname user %d: ", i+1);
scanf("%19s", travelers.surname);
fflush(stdin);
printf("Day of birth user %d: ", i+1);
scanf("%hu", &travelers.date_of_birth.day);
fflush(stdin);
printf("Month of birth user %d: ", i+1);
scanf("%hu", &travelers.date_of_birth.month);
fflush(stdin);
printf("Year of birth user %d: ", i+1);
scanf("%hu", &travelers.date_of_birth.year);
fflush(stdin);
printf("Place of birth user %d: ", i+1);
scanf("%9s", travelers.place_of_birth);
fflush(stdin);
printf("Passport number user %d: ", i+1);
scanf("%8s", travelers.passport_number);
fflush(stdin);
fwrite(&travelers, 1, sizeof(user), input);
i++;
//}
fclose(input);
}
}
define.h
#ifndef DEFINE_H_
#define DEFINE_H_
#define MAX_NAME 20
#define MAX_SURNAME 20
#define MAX_PASSPORT 9
#define MAX_PLACE_OF_BIRTH 15
#define MAX_FLIGHT_CODE 6
#define MAX_COMPANY_NAME 20
#define MAX_DEPARTURE 20
#define MAX_ARRIVAL 20
#define MAX_PLANE_CODE 5
#define MAX_SEATS 150
#define MAX_BOOKING_CODE 5
#endif /* DEFINE_H_ */
预期结果是struct list,通过fseek()[=67=寻找(基本选择) ] 在函数 checkin() 中应该保存在结构 travelers.b.list 中,而所有当我尝试打印它时,我得到的是各种符号等的混合。
我希望我已经为您弄清楚了所有内容,对于格式不正确等问题,我深表歉意
这对我来说是一个非常大的大学项目,我希望有人能帮助我。
谢谢。
在你写的inputUser中做
fwrite(&travelers, 1, sizeof(user), input);
这样做似乎更符合逻辑
fwrite(&travelers, sizeof(user), 1, input);
因为fwrite是
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
而不是
size_t fwrite(const void *ptr, size_t nmemb, size_t size, FILE *stream);
当然在其他地方也是一样的,比如checkIn,对于fread你也交换nmemb 和 尺寸
注意 checkin 你做了两次 flights = fopen("flights.dat", "rb")
:
if( (flights = fopen("flights.dat", "rb") ) == NULL) {
printf("Error.");
}
else {
printf("Available flights:\n\n");
flights = fopen("flights.dat", "rb");
因为你用了同一个变量flights只有第二个FILE可以关闭。一段时间后您将无法再次打开文件,因为同时打开的文件数量有限。
警告
while( !(feof(flights)))
一般does not work,使用fread的结果停止读取
您可以删除所有 fflush(stdin);
,它们什么都不做 :
For input streams associated with seekable files (e.g., disk files, but not pipes or terminals), fflush() discards any buffered data ...
我鼓励您检查 scanf 的结果以确保输入的内容有效,因此在读取值时检查 returns 1 并且2 你读到的几个案例 2 个值
也在
scanf("%d", &user_number); fseek(users, (user_number-1)*sizeof(user), SEEK_SET); fread(&travelers, 1, sizeof(user), users);
和
scanf("%d", &choice1); fseek(flights, (choice1-1)*sizeof(flight), SEEK_SET); fread(&list, 1, sizeof(flight), flights);
根本没有检查
所以你不知道你读到了什么,你假设为 user_number
和 choice1
输入了一个有效的 int,你假设它们的值是兼容的与文件的大小,然后你假设你可以读取 user/fligh
您确实需要添加支票
I guess the main problem is in the function checkin() inside booking.h
是的,在checkin你修改用户航班部分的方式不对,你这样做
fseek(users, (user_number-1)*sizeof(user), SEEK_SET); fwrite(&travelers.b.list, 1, sizeof(user), users);
fseek设置文件中用户开头的位置,而不是fwrite 所有用户你 fwrite 子部分 travelers.b.list
所以你替换 name/surname/...通过航班(以及它之后的内存,因为你写的是用户的大小而不是航班的大小)而且没有初始化,因为之前你 fread 在变量 list 而不是 travelers.b.list
.
更正的方法是更新travelers.b.list
然后写入所有用户,所以要替换
fread(&list, 1, sizeof(flight), flights); printf("\n--------YOU CHOSE FLIGHT %d-------- \n\n", choice1); printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n" "Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n", list.flight_code, list.companyname, list.departure, list.arrival, list.plane_code, list.date_of_flight.day, list.date_of_flight.month, list.date_of_flight.year, list.hour_departure, list.minute_departure,list.hour_arrival,list.hour_departure, list.flight_time); users = fopen("users.dat", "rb+"); fseek(users, (user_number-1)*sizeof(user), SEEK_SET); fwrite(&travelers.b.list, 1, sizeof(user), users);
来自
fread(&travelers.b.list, sizeof(flight), 1, flights);
printf("\n--------YOU CHOSE FLIGHT %d-------- \n\n", choice1);
printf("Flight code: %s\nCompany name: %s\nDEPARTURE FROM: %s\nARRIVAL AT: %s\nPlane code: %s\nDay of flight: %hu\nMonth of flight: %hu\n"
"Year of flight: %hu\nHour of departure: %hu:%hu\nHour of arrival: %hu:%hu\nFlight time: %hu min.\n\n",
travelers.b.list.flight_code, travelers.b.list.companyname, travelers.b.list.departure,
travelers.b.list.arrival, travelers.b.list.plane_code, travelers.b.list.date_of_flight.day,
travelers.b.list.date_of_flight.month, travelers.b.list.date_of_flight.year, travelers.b.list.hour_departure,
travelers.b.list.minute_departure,travelers.b.list.hour_arrival,travelers.b.list.hour_departure, travelers.b.list.flight_time);
users = fopen("users.dat", "rb+");
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers, sizeof(user), 1, users);
另一种更接近您的代码的方法是在正确的位置 fseek 并以正确的大小编写正确的航班,以便替换
fseek(users, (user_number-1)*sizeof(user), SEEK_SET); fwrite(&travelers.b.list, 1, sizeof(user), users);
来自
fseek(users, (user_number-1)*sizeof(user) + (((char *) &travelers.b.list) - ((char *) &travelers)), SEEK_SET); fwrite(&list, sizeof(list), 1, users);