# Daten aus Datei zeilenweise einlesen



## mezzix (14. Apr 2014)

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?


```
#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.


----------



## mezzix (14. Apr 2014)

mezzix hat gesagt.:


> 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.
> ...



2 Zeichen


----------



## mezzix (14. Apr 2014)

Sry, falschen Button gedrückt.


----------



## mezzix (14. Apr 2014)

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:

```
#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;
}
```


----------



## VfL_Freak (14. Apr 2014)

Moin,



mezzix hat gesagt.:


> ... jedoch stürzt das Programm deshalb immer ab.
> Hat jemand einen Hinweis darauf, was falsch ist?


nein, da wir keine Hinweis darauf haben, was schief läuft ..... :noe:

Gruß
Klaus


----------



## mezzix (14. Apr 2014)

VfL_Freak hat gesagt.:


> Moin,
> 
> 
> nein, da wir keine Hinweis darauf haben, was schief läuft ..... :noe:
> ...



"Projekt4.exe funktioniert nicht mehr"
"Process returned -1073741849 (0xC0000005)"

Glaube aber nicht das dir das weiterhilft?
Compiler gibt auch kein Error.


----------



## VfL_Freak (14. Apr 2014)

Moin,

hast Du denn mal gegoogled ???:L
https://www.google.de/#q=0xC0000005

Gruß
Klaus


----------



## mezzix (14. Apr 2014)

Googlen hilft mir bei der Fehlermeldung nicht. Das Problem liegt irgendwo bei der Zuweisung von Werten in das dynamische Array.


----------

