cfileloadpolynomials

Problems with Polynomials loading from file.txt to terminal


I have problem with my function. Basically I need to load Polynomials from file.txt to terminal.

Basically, I have several coefficients on each row, and 1 polynomial equals 1 row. When I try my output on terminals is weird. 1 coefficient does not print and neither does 3 line/3 polynomial.

Here is my function:

polynom* vytvorZeSouboru(const char *soubor, int *pocet) {
    FILE *file = fopen(soubor, "r");

    if (file == NULL) {
        perror("Chyba pri otevirani souboru");
        exit(EXIT_FAILURE);
    }

    // Number of polynomials in the file - set to 0 at the beginning
    *pocet = 0;

    // Find out how many rows (polynomials) are in the file
    int c;
    while ((c = fgetc(file)) != EOF) {
        if (c == '\n') {
            (*pocet)++;
        }
    }

    // Let's go back to the beginning of the file
    rewind(file);

    // Pole polynomů
    Polynom *polePolynomu = (Polynom*)malloc(*pocet * sizeof(Polynom));

    //  Reading polynomials from a file
    for (int i = 0; i < *pocet; ++i) {
        int pocetKoeficientu;
        if (fscanf(file, "%d", &pocetKoeficientu) != 1) {
            fprintf(stderr, "Chyba pri cteni poctu koeficientu polynomu ze souboru.\n");
            exit(EXIT_FAILURE);
        }
       

        // Polynomial initialization
        polePolynomu[i].koeficienty = (int*)malloc(pocetKoeficientu * sizeof(int));
        polePolynomu[i].pocetKoeficientu = pocetKoeficientu;

        // Načtení koeficientů polynomu
        for (int j = 0; j < pocetKoeficientu; ++j) {
            if (fscanf(file, "%d", &polePolynomu[i].koeficienty[j]) != 1) {
                fprintf(stderr, "Chyba pri cteni koeficientu polynomu ze souboru.\n");
                exit(EXIT_FAILURE);
            }
        }
    }

    // Zavření souboru
    fclose(file);

    return polePolynomu;
}

void vypisPolynomy(const Polynom *polePolynomu, int pocet) {
    for (int i = 0; i < pocet; ++i) {
        printf("Polynom %d: ", i + 1);
        for (int j = 0; j < polePolynomu[i].pocetKoeficientu; ++j) {
            printf("%d ", polePolynomu[i].koeficienty[j]);
        }
        printf("\n");
    }
}

int main() {
    int pocet, i;
    
    const char *cestaKSouboru = "vytvorZeSouboru.txt"; 
     
    Polynom *polePolynomu = vytvorZeSouboru(cestaKSouboru, &pocet);
    
    vypisPolynomy(polePolynomu, pocet);

    // Memory release
    for (int i = 0; i < pocet; ++i) {
        free(polePolynomu[i].koeficienty);
    }
    free(polePolynomu);
}

Solution

  • Addressing one potential issue.

    Line count

    Code counts the number of '\n' to determine line count. This is off-by-one if the last line lacks a final '\n' before EOF.

    Alternative, count the number of line begininngs.

    *pocet = 0;
    int prior = '\n';
    int c;
    while ((c = fgetc(file)) != EOF) {
      if (prior == '\n') {
        (*pocet)++;
      }
      prior = c;
    }