Как прочитать структуру из текстового файла, который я создал? - PullRequest
0 голосов
/ 13 июня 2019

Я пишу код C для программы, имитирующей базу данных пациентов. Мне удалось написать код, который добавляет пациента в базу данных и сохраняет информацию в текстовом файле.

Код, который закрывает БД и сохраняет информацию в текстовый файл, приведен ниже и работает нормально:

FILE *close_file;

close_file = fopen(file_name, "w");

if (close_file == NULL){
printf("save information to file failed!\n");
fclose(close_file);
exit(EXIT_FAILURE);
}

fprintf(close_file, "%d\n", *num_of_structs);/*Enters the number of the 
                                               patient in the DB in the 
                                              beginning of the text file*/

for (int j = 0; j < *num_of_structs;j++){

/*the for loop down below is to write referens number to the patients x- 
ray pictures, so the first two numbers in the text file belong to an array 
of two rooms*/

for (int picture = 0; picture < 2; picture++){
fprintf(close_file, "%d ", patientRegister[j].pictures[picture]);
}

/*down below I write the personal number and the name of the patient to 
the text file*/

fprintf(close_file, "%d %s", patientRegister[j].personal_number, 
patientRegister[j].patient_name);

}

fclose(close_file);

}

текстовый файл может выглядеть так: https://ibb.co/FKdx4vg

Моя проблема в том, как читать из этого текстового файла? Я пробовал много кода, но безуспешно. Посмотрите мой код, который не работает для меня, кроме строки:

fscanf(existing_file, "%d", num_of_structs);/*This reads the first number 
at the top of the text file and which represents the number of patients in 
the DB*/

Просмотрите всю функцию, которая должна открывать текстовый файл и читать из него:

void open_existing_file(Patient patientRegister[], char file_name[], int 
*num_of_structs) {

FILE *existing_file;

existing_file = fopen(file_name, "r");

if (existing_file == NULL) {
printf("Open existing file failed\n");
fclose(existing_file);
exit(EXIT_FAILURE);
}


fscanf(existing_file, "%d", num_of_structs);/*This reads the first number 
at the top of the text file and which represents the number of patients in 
the DB*/

/*I guess I'm doing a lot of wrong code down here?!*/

for (int j = 0; j < (*num_of_structs); j++) {

for (int picture = 0; picture < 2; picture++) {
fscanf(existing_file, "%d", patientRegister[j].pictures[picture]);
}

fscanf(existing_file, "%d %s", patientRegister[j].personal_number, 
patientRegister[j].patient_name);}

fclose(existing_file);
}

1 Ответ

0 голосов
/ 13 июня 2019

Спецификатор формата %d для scanf ожидает, что адрес равен int, то есть int *, а не int.Это так, что он принимает значение, которое он прочитал, и записывает его в переменную.

Итак, вы хотите:

fscanf(existing_file, "%d", &num_of_structs);
...
fscanf(existing_file, "%d", &patientRegister[j].pictures[picture]);
...
fscanf(existing_file, "%d %s", &patientRegister[j].personal_number, patientRegister[j].patient_name);

Обратите внимание, что вам не нужно & для %s длячитать в массив, так как массив автоматически распадается на указатель на его первый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...