#include #include #include #include #include #include #define DELKA_BUFFERU 1024 #define SEPARATORY " ;\t\n" #define VSTUPNI_SOUBOR "matice.txt" #define VYSTUPNI_SOUBOR "matice_vystup.txt" #define CTENI_CISLA \ errno = 0;\ cislo_long = strtol(cislo_string, &odpad, 10);\ dlouhe_cislo = cislo_long > INT_MAX || cislo_long < INT_MIN;\ if (errno != 0 || dlouhe_cislo || cislo_string == odpad) {\ printf("Na radku c. %d ve sloupku c. %d je neplatne cislo %s! %s\n", i + 1, j + 1, cislo_string, sys_errlist[errno]);\ return 1;\ } else {\ x[i][j] = (int)cislo_long;\ }\ if (*odpad != '\0') {\ printf("Na radku c. %d ve sloupku c. %d bylo zahozeno \"%s\"!\n", i + 1, j + 1, odpad);\ } int main() { FILE *fr, *fw; char buffer_radku[DELKA_BUFFERU]; char *odpad; char *cislo_string; long cislo_long; bool nalezen_radek_s_daty = false, dlouhe_cislo; int radek = 0, sloupek = 0, aktualni_sloupek, aktualni_radek = 0, i, j, delka_radku; int **x; int *p_i; if ((fr = fopen(VSTUPNI_SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", VSTUPNI_SOUBOR); return 1; } while (fgets(buffer_radku, DELKA_BUFFERU, fr) != NULL) { if (NULL != strtok(buffer_radku, SEPARATORY)) { radek++; } } fclose(fr); if (!radek) { printf("Soubor %s nema ani jeden radek s daty.\n", VSTUPNI_SOUBOR); return 1; } if ((fr = fopen(VSTUPNI_SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", VSTUPNI_SOUBOR); return 1; } while ((fgets(buffer_radku, DELKA_BUFFERU, fr) != NULL) && !nalezen_radek_s_daty) { cislo_string = strtok(buffer_radku, SEPARATORY); if (cislo_string != NULL) { sloupek++; nalezen_radek_s_daty = true; } while ((cislo_string = strtok(NULL, SEPARATORY)) != NULL) { sloupek++; } } fclose(fr); if ((fr = fopen(VSTUPNI_SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", VSTUPNI_SOUBOR); return 1; } while (fgets(buffer_radku, DELKA_BUFFERU, fr) != NULL) { delka_radku = strlen(buffer_radku); if (delka_radku == DELKA_BUFFERU - 1 && buffer_radku[delka_radku - 1] != '\n') { printf("Radek zacinajici na \"%s\" je delsi nez %d znaku.\n", buffer_radku, DELKA_BUFFERU - 2); /* 1 znak pro '\n' a 1 znak pro '\0' */ return 1; } aktualni_sloupek = 0; cislo_string = strtok(buffer_radku, SEPARATORY); if (cislo_string != NULL) { aktualni_radek++; aktualni_sloupek++; while ((cislo_string = strtok(NULL, SEPARATORY)) != NULL) { aktualni_sloupek++; } if (aktualni_sloupek != sloupek) { printf("Radek cislo %d ma %d prvku, ale prvni radek ma %d prvku.", aktualni_radek, aktualni_sloupek, sloupek); return 1; } } } fclose(fr); if ((p_i = (int *) malloc(radek * sloupek * sizeof(int))) == NULL) { printf("Malo pameti!\n"); return 1; } if ((x = (int **) malloc(radek * sizeof(int *))) == NULL) { printf("Malo pameti!\n"); return 1; } for (i = 0; i < radek; i++) { x[i] = p_i + (i * sloupek); } if ((fr = fopen(VSTUPNI_SOUBOR, "r")) == NULL) { printf("Soubor %s se nepodarilo otevrit.\n", VSTUPNI_SOUBOR); return 1; } i = 0; j = 0; while (fgets(buffer_radku, DELKA_BUFFERU, fr) != NULL) { cislo_string = strtok(buffer_radku, SEPARATORY); if (cislo_string != NULL) { CTENI_CISLA j++; while ((cislo_string = strtok(NULL, SEPARATORY)) != NULL) { CTENI_CISLA j++; } i++; j = 0; } } fclose(fr); fw = fopen(VYSTUPNI_SOUBOR, "w"); for (i = 0; i < radek; i++) { for (j = 0; j < sloupek; j++) { fprintf(fw, "%d ", x[i][j]); } fprintf(fw, "\n"); } fclose(fw); free((void *) p_i); free((void *) x); printf("%d %d %ld %ld",INT_MIN, INT_MAX, LONG_MIN, LONG_MAX); /* Funkce strtol() uspesne nacte cislo, ale to se nevejde do typu int. */ /* dlouhe_cislo = cislo_long > INT_MAX || cislo_long < INT_MIN; */ return 0; }