обработка файлов с использованием структурированного массива - PullRequest
2 голосов
/ 26 мая 2019

Я хочу сохранить строковые и символьные данные в файл .dat. Программа работает правильно. Но после открытия файла .dat пишется то же имя дважды. Почему это? Я не могу найти проблему.

#include<stdio.h>

struct patients{
        char name[8];
        char appType[1];
};

int main(void)
{

    FILE *F1;
    F1 = fopen("appointment.dat","a");

    int i = 0;
    struct patients detailsArr[5];

    for( i = 0 ; i < 5 ; i++ )
    {
        printf("Enter Patient Name : ");
        scanf("%s",detailsArr[i].name);

        printf("Enter Appointment Type :");
        scanf(" %c",detailsArr[i].appType);

    }

    if ( F1 == NULL )
    {
        printf("Error in File Reading !");
        return -1;
    }

    for( i = 0 ; i < 5 ; i++ )
    {
        fprintf(F1 ,"%s\t",detailsArr[i].name);
        fprintf(F1 ,"%s",detailsArr[i].appType);
        fprintf(F1 ,"\n");

    }

    fclose(F1);

    return 0;
}

Это мой вывод:

Dilshan CRuwan
Ruwan   TMangala
Mangala SGanesh
Ganesh  CJithen
Jithen  SV

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Вам необходимо изменить эту строку:

char appType[1];

на эту:

char appType;

, если вы хотите использовать спецификатор формата %c scanf.

Чтобы избежать переполнения (и строк с ненулевым символом в конце), вам также следует использовать %7s вместо %s в этой строке:

 scanf("%s",detailsArr[i].name);

Вам также необходимо изменить эту строку:

 fprintf(F1 ,"%s",detailsArr[i].appType);

на это:

 fprintf(F1 ,"%c",detailsArr[i].appType);

Это просто вопрос изменения типа.

0 голосов
/ 26 мая 2019

Это похоже на древний формат структуры с фиксированным дополнением, поэтому эти fprintfs неверны.Должно быть:

fprintf(F1 ,"%.8s\t",detailsArr[i].name);
fprintf(F1 ,"%.1s",detailsArr[i].appType);

Мы также должны изменить строку scanf на

scanf("%8s",detailsArr[i].name);

, чтобы она могла на самом деле хранить все 8.

Причина, по которой это не сработало, в противном случае вашаФормат struct выглядит как строки с нулевым символом в конце, когда используется максимальный размер строки.Это требует обработки как таковой со строками формата printf и scanf, а также копирования и вывода с помощью strncpy.Это довольно неудобный код, поэтому он редко используется, за исключением низкоуровневых форматов дисков.

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