C 如何将二进制文件中的结构写入另一个二进制文件中的嵌套结构?
我有这个密码。假设我想将航班1(使用函数InputFlight生成)链接到用户1(使用函数InputUser生成)。 注意:structuser有另一个嵌套结构,名为booking,它有一个嵌套结构,名为flight 通过在二进制文件中移动指针,我所做的就是: 向用户询问航班号(假设是第一次航班)->然后我转到第一次航班 询问用户他是哪个用户(让我们假设第一个用户)->所以我转到第一个用户 然后通过fread()和fwrite(),我尝试将结构flight中的内容复制到travelers.b.list,但不知何故,它无法工作 我什么都试过了。我尝试在fwrite()和fseek()中更改参数,但没有成功。我想主要问题在于函数checkin()inside booking.h,但我似乎无法解决它 main.cC 如何将二进制文件中的结构写入另一个二进制文件中的嵌套结构?,c,file,struct,binaryfiles,fwrite,C,File,Struct,Binaryfiles,Fwrite,我有这个密码。假设我想将航班1(使用函数InputFlight生成)链接到用户1(使用函数InputUser生成)。 注意:structuser有另一个嵌套结构,名为booking,它有一个嵌套结构,名为flight 通过在二进制文件中移动指针,我所做的就是: 向用户询问航班号(假设是第一次航班)->然后我转到第一次航班 询问用户他是哪个用户(让我们假设第一个用户)->所以我转到第一个用户 然后通过fread()和fwrite(),我尝试将结构flight中的内容复制到travelers.b.l
#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;
}
}
}
预期结果是,通过函数checkin()中的fseek()查找(基本上选择)的structlist应该保存在structtravelers.b.list中,而当我尝试打印它时,我得到的只是各种符号等的混合
我希望我已经为你准备好了一切,并为糟糕的格式等提前道歉
这对我来说是一个非常大的大学项目,我希望有人能帮助我
谢谢。您在inputUser中写的是什么 这样做似乎更合乎逻辑
fwrite(&travelers, sizeof(user), 1, input);
因为fwrite是
大小写入(const void*ptr、大小、大小nmemb、文件*流)
而不是
大小写入(const void*ptr、大小nmemb、大小,
文件*流)
当然,在其他地方也一样,比如签入,在fread中,您还可以交换nmemb和大小
注意:在签入中,您要执行两次
flights=fopen(“flights.dat”、“rb”)
:
因为使用相同的变量flights,所以只能关闭第二个文件。一段时间后,您将无法再次打开文件,因为同时打开的文件数量有限
警告 通常,使用fread的结果停止读取
您可以删除所有
fflush(stdin)代码>,它们什么也不做:
对于与可查找文件(例如,磁盘文件)关联的输入流,
但不是管道或终端),fflush()丢弃任何缓冲数据
我鼓励您检查scanf的结果,以确保输入了有效的输入,因此当您读取一个值时,检查它将返回1,在少数情况下,您将读取2个值
也在
及
根本没有支票
所以你不知道你读了什么,你假设为user\u number
和choice1
输入了一个有效的int,你假设它们的值与文件大小兼容,然后你假设你可以读取一个user/fligh
你真的需要加支票
我想主要的问题是booking.h中的checkin()函数
是的,以签入方式修改用户的航班部分是不正确的,是吗
fseek将用户的位置设置在文件的开头,但不是写入所有用户,而是写入子部分travelers.b.list
,这样您就可以替换名称/姓氏/。。。通过航班(以及它之后的内存,因为您写入了用户的大小而不是航班的大小),并且没有初始化,因为之前您在变量列表中而不是在travelers.b.list
一种纠正方法是更新travelers.b.list
,然后写入所有用户,以便替换
借
另一种更接近代码的方法是在正确的位置进行fseek,并用正确的大小编写正确的航班,以便替换
借
您没有给出重现问题的方法,但我在回答中对代码的“可完善”部分做了一些评论(抱歉,将其编辑了几次)。在我的回答中我并没有这样说,但是在头文件中定义函数不是一个好主意,使用几个源文件。我建议不要在二进制文件中放置结构,因为它不可移植。定义二进制文件时,请直接指定每个字节的字节值,并进行必要的转换,可能需要借助序列化库。@bruno在.h中定义函数,在相关的.c中定义函数本身,这是我们老师的选择。我对此无能为力。@Slimshady通常我们把函数声明放在h文件中,而不是它们的定义中,你确定能理解老师的要求吗?@aschepler你能详细说明你的答案吗?你是说我不应该把结构保存在二进制文件中?如果是这样,我如何在文件本身中移动指针并进行所需的编辑?(因为管理员可以更改航班时间,或者更改公司名称。)。我做了你提到的所有改变。1) 如图所示,更改了fwrite()和fread()参数。2) 只打开flights.dat一次3)而不是feof,我使用
while(read!=0)
作为读取所有文件的条件。4) 删除了所有fflush(stdin)代码>。我应该实现gets()
而不是scanf()
?5) 我只是尝试将user1与flight1链接,所以我的选择(就目前而言)在user_number和choice1中始终为1。我将在修复主要问题时执行各种检查->复制从fread(&list,1,sizeof(flight),flights)获得的结构
进入checkIn()中的travelers.b.list。@SlimShadys当您说“我得到的是各种符号的混合等等”时,是在执行期间还是在生成的文件中?如果在文件中,这是正常的,因为您
#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);
//}
}
#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);
}
}
#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_ */
fwrite(&travelers, 1, sizeof(user), input);
fwrite(&travelers, sizeof(user), 1, input);
if( (flights = fopen("flights.dat", "rb") ) == NULL) {
printf("Error.");
}
else {
printf("Available flights:\n\n");
flights = fopen("flights.dat", "rb");
while( !(feof(flights)))
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);
fseek(users, (user_number-1)*sizeof(user), SEEK_SET);
fwrite(&travelers.b.list, 1, sizeof(user), users);
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(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);