Daten aus Datei zeilenweise einlesen

mezzix

Mitglied
Hi,
ich muss aus einer .txt Daten einlesen und in einem dynamischen Feld speichern. Dieses soll die Größe immer verdoppeln, wenn es voll ist. Dazu soll Speicherplatz mit "calloc" reserviert werden.
Beim Einlesen der Datei soll auch die erste Zeile übersprungen werden.
Mein Problem ist jetzt, dass die Werte nicht korrekt eingelesen werden. Normalerweise würde ich das ganze in einer while-Schleife machen, jedoch endet diese nicht (deswegen auskommentiert). Habe erstmal einen Zähler bis 21 eingebaut, da ich 21 Zeilen einlesen muss.
Kann mir jemand helfen, wo das Problem liegt?

Code:
#include <stdio.h>
#include <stdlib.h>

    typedef struct {
        int objektnr;
        char bezeichnung [20];
    } messobjekt;

    typedef struct {
        messobjekt *objekt;
        int messnr;
        double messwert;
    } messwert;

int main () {
    int size = 3;
    messwert *dynfeld;
    dynfeld = (messwert*)calloc(size, sizeof(messwert));
    dynfeld->objekt = (messobjekt*)calloc(size, sizeof(messobjekt));

    FILE * file;
    file = fopen("messungen.txt", "r");

    int tempmessnr;
    double tempmesswert;
    int tempobjektnr;
    char tempbezeichnung [20];
    int zaehler = 0;
    int wieoftdurchlaufen = 0;
    fseek(file, 50L, SEEK_SET);
    while (zaehler < 21) {
    //while (feof(file)==0) {
            fscanf(file, "%d,%[^,]%c,%d,%,lf\n", &tempobjektnr, &tempbezeichnung, &tempmessnr, &tempmesswert);
            //fscanf(file, "%d,%[^,]%c,%d,%lf", &dynfeld[zaehler].objekt->objektnr, &dynfeld[zaehler].objekt->bezeichnung, &(dynfeld[zaehler].messnr), &(dynfeld[zaehler].messwert));
            //printf("\nWerte: %d,%s,%d,%lf", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
            printf("\nWerte: %d,%s,%d,%lf", tempobjektnr, tempbezeichnung, tempmessnr, tempmesswert);

        //Rechnung noch nicht richtig? evtl wieoftdurchlaufne-1
        if (zaehler == 3*(2^(wieoftdurchlaufen)) ) {
            dynfeld = (messwert*)realloc(dynfeld, 2*zaehler*sizeof(messwert));
            wieoftdurchlaufen = 0;
            printf("\nSpeicher erfolgreich verdoppelt!");
            wieoftdurchlaufen++;
        }
        zaehler++;
    }

//    int zaehler2 = 0;
//    int feldLaenge = sizeof(dynfeld)/sizeof(messwert);
//    for (; zaehler2 < feldLaenge; zaehler++) {
//        printf("\n%d,%s,%d,%f", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
//    }
    return 0;
}

Edit: Zudem springt er nicht in die anderen Zeilen, er versucht die erste einzulesen, was auch teilweise stimmt. Danach jedoch kommen komische Werte raus.
 
Zuletzt bearbeitet:

mezzix

Mitglied
Hi,
ich muss aus einer .txt Daten einlesen und in einem dynamischen Feld speichern. Dieses soll die Größe immer verdoppeln, wenn es voll ist. Dazu soll Speicherplatz mit "calloc" reserviert werden.
Beim Einlesen der Datei soll auch die erste Zeile übersprungen werden.
Mein Problem ist jetzt, dass die Werte nicht korrekt eingelesen werden. Normalerweise würde ich das ganze in einer while-Schleife machen, jedoch endet diese nicht (deswegen auskommentiert). Habe erstmal einen Zähler bis 21 eingebaut, da ich 21 Zeilen einlesen muss.
Kann mir jemand helfen, wo das Problem liegt?

Code:
#include <stdio.h>
#include <stdlib.h>

    typedef struct {
        int objektnr;
        char bezeichnung [20];
    } messobjekt;

    typedef struct {
        messobjekt *objekt;
        int messnr;
        double messwert;
    } messwert;

int main () {
    int size = 3;
    messwert *dynfeld;
    dynfeld = (messwert*)calloc(size, sizeof(messwert));
    dynfeld->objekt = (messobjekt*)calloc(size, sizeof(messobjekt));

    FILE * file;
    file = fopen("messungen.txt", "r");

    int tempmessnr;
    double tempmesswert;
    int tempobjektnr;
    char tempbezeichnung [20];
    int zaehler = 0;
    int wieoftdurchlaufen = 0;
    fseek(file, 50L, SEEK_SET);
    while (zaehler < 21) {
    //while (feof(file)==0) {
            fscanf(file, "%d%c%[^,]%c%c%d%c%%clf\n", &tempobjektnr, &c, &tempbezeichnung, &c, &tempmessnr, &c, &tempmesswert, &c);
            //fscanf(file, "%d,%[^,]%c,%d,%lf", &dynfeld[zaehler].objekt->objektnr, &dynfeld[zaehler].objekt->bezeichnung, &(dynfeld[zaehler].messnr), &(dynfeld[zaehler].messwert));
            //printf("\nWerte: %d,%s,%d,%lf", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
            printf("\nWerte: %d,%s,%d,%lf", tempobjektnr, tempbezeichnung, tempmessnr, tempmesswert);

        //Rechnung noch nicht richtig? evtl wieoftdurchlaufne-1
        if (zaehler == 3*(2^(wieoftdurchlaufen)) ) {
            dynfeld = (messwert*)realloc(dynfeld, 2*zaehler*sizeof(messwert));
            wieoftdurchlaufen = 0;
            printf("\nSpeicher erfolgreich verdoppelt!");
            wieoftdurchlaufen++;
        }
        zaehler++;
    }

//    int zaehler2 = 0;
//    int feldLaenge = sizeof(dynfeld)/sizeof(messwert);
//    for (; zaehler2 < feldLaenge; zaehler++) {
//        printf("\n%d,%s,%d,%f", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
//    }
    return 0;
}

Edit: Zudem springt er nicht in die anderen Zeilen, er versucht die erste einzulesen, was auch teilweise stimmt. Danach jedoch kommen komische Werte raus.

2 Zeichen
 

mezzix

Mitglied
Nachdem ich mich jetzt nochmal lange drangesetzt habe, bin ich einen kleinen Schritt weiter. Jetzt müsste ich dem Array die "temp..." Variablen übergeben, jedoch stürzt das Programm deshalb immer ab.
Hat jemand einen Hinweis darauf, was falsch ist?

Hier nochmal der aktuelle Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

    typedef struct {
        int objektnr;
        char bezeichnung [20];
    } messobjekt;

    typedef struct {
        messobjekt *objekt;
        int messnr;
        double messwert;
    } messwert;

int main () {

    int size = 3;
    messwert *dynfeld;
    dynfeld = (messwert*)calloc(size, sizeof(messwert));
    dynfeld->objekt = (messobjekt*)calloc(size, sizeof(messobjekt));

    FILE * file;
    file = fopen("messungen.txt", "r");

    int tempmessnr;
    double tempmesswert;
    int tempobjektnr;
    char tempbezeichnung [20];
    int zaehler = 0;
    int wieoftdurchlaufen = 0;
    fseek(file, 50L, SEEK_SET);
    char c;
    //while (zaehler < 21) {
    while (feof(file)==0) {
           fscanf(file, "%d%c%[^,]%c%d%c%lf\n", &tempobjektnr, &c, &tempbezeichnung, &c, &tempmessnr, &c, &tempmesswert);
            //fscanf(file, "%d%c%[^,]%c%d%c%lf\n", &dynfeld[zaehler].objekt->objektnr, &c, &dynfeld[zaehler].objekt->bezeichnung, &c, &(dynfeld[zaehler].messnr), &c, &(dynfeld[zaehler].messwert));
            //printf("\nWerte: %d,%s,%d,%lf", tempobjektnr, tempbezeichnung, tempmessnr, tempmesswert);
            dynfeld[zaehler].objekt->objektnr = tempobjektnr;
            strcat(dynfeld[zaehler].objekt->bezeichnung, tempbezeichnung);
            dynfeld[zaehler].messnr = tempmessnr;
            dynfeld[zaehler].messwert = tempmesswert;
            //printf("\nWerte: %d,%s,%d,%lf", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);


            zaehler++;
            //Rechnung noch nicht richtig? evtl wieoftdurchlaufne-1
            if (zaehler == 3*(2^(wieoftdurchlaufen)) ) {
                dynfeld = (messwert*)realloc(dynfeld, 2*zaehler*sizeof(messwert));
                wieoftdurchlaufen = 0;
                printf("\nSpeicher erfolgreich verdoppelt!");
                wieoftdurchlaufen++;
            }
            //zaehler++;
    }

//    int zaehler2 = 0;
//    int feldLaenge = sizeof(dynfeld)/sizeof(messwert);
//    for (; zaehler2 < feldLaenge; zaehler++) {
//        printf("\n%d,%s,%d,%f", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
//    }
    return 0;
}
 

Neue Themen


Oben