Я пытаюсь реализовать систему сохранения, которая позволяет мне сохранять введенные пользователем данные структуры пакета, которые пользователь вводил в оператор switch. Каждая введенная запись сохраняется в одном файле, разделенном по строкам в виде обычного текста. Он также должен указать пользователю, что они хотели бы назвать файл, тогда программа должна указать, сколько записей было сохранено в файле, наконец, если имя не было введено для файла сохранения, оно должно вернуться в главное меню.Сохранение структуры данных в текстовый файл
как вы можете видеть из функции сохранения пустоты внизу, я попытался реализовать эту систему сохранения, но когда я запускаю программу и выбираю S, чтобы сохранить записи в файл, она просто сбрасывает программу после ввода имя для имени файла. Поэтому, если бы кто-нибудь мог мне помочь в этом, это было бы здорово.
struct packet{
int source;
int destination;
int type; // Varibles for the structure
int port;
char data[50];
char * filename;
};
void save(int, struct packet*); //function to save the records stored to a file
int main()
{
struct packet s[50]; //Array for structure input
char choice;
int NetworkPacket = 0, ii = 0;
int recordCount = 0;
struct packet *records;
struct packet *temp;
records = malloc(sizeof(struct packet));
саз для выбора, чтобы сохранить файл
case 'S':
system("cls"); //clear the screen
save(NetworkPacket, records); //S was chosen so use the Save function
break;
функция сохранения
void save(int rCount, struct packet *records){
FILE *recordFile; //file handle
char fileName[30] = { '\0'}; //string to store the file name
int i;
puts("Enter a filename to save the records :"); //ask the user for the filename
scanf("%s", fileName); //store the filename: data input should be checked
//here in your program
//try and open the file for writing and react accordingly if there is a problem
if((recordFile = fopen(fileName,"w"))==NULL){
printf("Couldn't open the file: %s\n",fileName);
exit(1);
}
else{ //the file opened so print the records array of packets to it
for(i=0;i<rCount;i++){
fprintf(recordFile,"%04d %04d %04d %04d %s\n",
records[i].source,
records[i].destination,
records[i].type,
records[i].port,
records[i].port,
records[i].data);
}
fclose(recordFile); //close the file
}
}
Построить a de ошибка, и запустить в отладчике. Он остановится в месте аварии и позволит вам изучить и подобрать стек вызовов функций. Когда вы поднимаете стек вызовов до места, в вашем коде происходит сбой, вы сможете изучить значения переменных. –
Вещи, которые нужно искать до этого, могут быть значением 'rCount' (' NetworkPacket') и убедиться, что у вас достаточно выделенной памяти для указателя 'records' (прямо сейчас вы, кажется, выделяете только одну структуру пакета). –
Вы уверены, что записи [i] .data - строка с нулевым завершением? –