Úloha 5.3

Napíšte program, zdrojový kód, v jazyku C použitím štandardu C17, ktorý načíta súbor vypocty.txt a pokračuje v jeho zapisovaní.

Program na začiatku načíta súbor vypocty.txt. Ak súbor neexistuje vytvorí ho. Ak súbor existuje načíta postupne z neho všetky výpočty a zvaliduje či sú správne vypočítané, t.j. či z načítanej trojice čísel v riadku súčet prvých dvoch čísiel sa rovná tretiemu číslu. Ak kontrola narazí na nesprávny výpočet tak na to upozorní používateľa vypísaním načítaných čísel a chybovou správou, program však pokračuje ďalej. Keď program načíta všetky existujúce výpočty vypíše koľko výpočtov načítal na obrazovku.

Program následne pokračuje v rovnakej činnosti ako v úlohe 5.2 s opýtaním sa používateľa o dve čísla a vypočíta ich súčet. Výpočet potom zapíše na koniec súboru. Existujúce dáta nesmú byť prepísané. Formát súboru vypocty.txt musí byť zachovaný ako je v úlohe 5.2.

Warning

Dávajte si pozor na mód pod ktorým otvárate súbor a na zatvorenie súboru pred skončením programu.


Rozbaľ pre ukážku riešenia
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int get_input(char *message) {
    char input[100];
    printf("%s", message);
    scanf("%s", input);
    if (input[0] == 'q') return INT_MIN;
    return atoi(input);
}

void verify_file(FILE *file) {
    int a, b, result;
    int read = 0;
    int line = 1;
    while ((read = fscanf(file, "%d %d %d\n", &a, &b, &result)) != EOF) {
        if (a + b != result) {
            printf("Chyba na riadku %d. %d + %d != %d (správne %d)\n", line, a, b, result, a + b);
        }
        line++;
    }
    printf("Načítaných %d výpočtov zo súboru\n", line-1);
}

int main() {
    FILE *file = fopen("../vypocty.txt", "a+");
    if (file == NULL) return 1;

    verify_file(file);

    while (1) {
        int a, b, result;
        a = get_input("Zadajte prvé číslo pre súčet: ");
        if (a == INT_MIN) break;
        b = get_input("Zadajte druhé číslo pre súčet: ");
        result = a + b;
        printf("%d + %d = %d\n", a, b, result);
        fprintf(file, "%d %d %d\n", a, b, result);
        printf("-------------\n");
    }

    fclose(file);
    return 0;
}