В C я не могу обновить при закрытии базы данных программы - PullRequest
0 голосов
/ 01 ноября 2019

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

Например: в этой программе я хочу вычестьвведенное значение из сохраненного. Итак, сначала я ввожу 3, затем он дает 12. Когда я снова запускаю программу и ввожу 2, то это дает 13, но это должно дать 10, а не 13.

#include<stdio.h>

#define PATH "/tmp/file"

int main()
{
    FILE *file;
    int age=15,s;

    scanf("%d",&s);
    file = fopen(PATH, "w");
    age = age - s;
    fprintf(file, "%d", age);
    fclose(file);
    file = fopen(PATH,"r");
    if (file == NULL)
    {
        printf("files does not exist");
    }
    fscanf(file,"%d",&age);
    printf("%d",age);
    fclose(file);
}

1 Ответ

0 голосов
/ 01 ноября 2019

Проблема в том, что вы всегда инициализируете возраст до 15 лет, а не то, что в вашем файле. Затем вы записываете этот возраст в файл и сразу же читаете его обратно.

Если я вас правильно понял, вы хотите сначала прочитать файл (не перезаписывать его), затем выполнить расчет и записать результат обратно. .

#include<stdio.h>

#define PATH "/tmp/file"

int main()
{
    FILE *file;
    int age = 15, s;

    file = fopen(PATH, "r");
    if (file == NULL)
    {
        printf("files does not exist");
        return 1;
    }
    fscanf(file, "%d", &age);
    fclose(file);

    scanf("%d", &s);

    file = fopen(PATH, "w");
    age = age - s;
    fprintf(file, "%d", age);
    fclose(file);

    printf("%d", age);
}

Обратите внимание, что вы должны также выполнять обработку ошибок для записи, а не только для чтения. Запись может завершиться с ошибкой, если файловая система заполнена или если у вас нет прав на запись.

Однако обработка ошибок не завершена: в коде вы печатаете сообщение об ошибке, но продолжаете работать. Доступ к неверному указателю файла (например, NULL) приведет к сбою вашей программы с ошибкой сегментации. Я добавил оператор возврата, но вы также можете поместить оставшуюся логику в блок else.

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