Versuche einen String in einen struct zu schreiben



  • Hi bin neu hier und habe auch erst angefangen zu programmieren also entschuldigt meine Unbeholfenheit.

    Ich habe eine Textdatei in der sich in jeder Zeile genau gleichviele Zeichen enthalten sind. Diese Textdatei soll ich zeilenweise auslesen, das funktioniert auch schon. Nun soll ich diese Zeile aber in ein struct bringen, der mehrere elemente aus untersdchiedlich großen arrays enthält. Jetzt wollte ich mal wissen ab es eine Möglichkeit gibt dies zu tun, ohne dass jedes Element in dem struct extra angesprochen wurde. Bis jetzt mach ich es mit strncopy und sag dann ab welchem Zeichen gelesen werden soll und wieviele Zeichen eingelesen werden sollen.

    Wäre über eine Antwort sehr glücklich.



  • Lass das doch deine struct (class) machen.
    Baust du beispielsweise eine Methode "loadfromfile(dateiname)" und diese füllt dann die Membervariablen.



  • Hi rama,

    habe absult keine Ahnung wie du das meinst, musst du mir bitte genauer erklären, bin blutiger anfänger.



  • Das hier entspreicht zwar nicht exakt dem, was rama gesagt hat, dürfte aber besser mit deinen Vorbedingungen zusammenarbeiten:

    Du gibst deiner Struktur eine Methode (z.B.) InitFromString(const string& data), die die übergebene Textzeile auswertet und auf die einzelnen Struct-Elemente verteilt. Dann mußt du diese Methode nur noch mit dem Text aufrufen, den du schon eingelesen hast.

    (PS: Wenn die Daten sowieso schon binär codiert in deiner Datei stehen, könntest du auch fstream::read() bzw. fread() verwenden, um deinen struct damit zu füllen)



  • Zeig doch erstmal wie deine structur und deine Daten aus der Datei so grob aussehen.



  • Also ich habe eine Zeile mit 457 Zeichen + \0, diese enthält enthält Zahlenkombination, viele Leerzeichen, Namen etc.
    Beispiel:
    1 010001260820570Diakoniekrankenhaus Speyerer Str. 91-93 68163 Mannheim G 1356 0

    steht alles in einer Zeile.
    Diese soll wie folgt zerlegt werden.
    erst 40 Zeichen, dann 12 Zeichen, 40 Zeichen, 6 Zeichen, 9 Zeichen, 112 Zeichen, 50 Zeichen, 10 Zeichen, 50 Zeichen, 5 Zeichen, 1 Zeichen, 5 Zeichen, 5 Zeichen, 112 Zeichen.

    ich habe also ein Struct angelegt in dem für jede Zeichen länge ein Array enthalten ist.



  • Du lädst das doch in einen string (egal ob nun AnsiString oder std::string).
    Diesen string zerlegst du dann in deiner Methode (Stichwort substr) und weist den Membervariablen diesen zerlegten string zu.
    ps:Bischen Code für deinen Ansatzwär nicht schlecht.



  • ich habe also ein Struct angelegt in dem für jede Zeichen länge ein Array enthalten ist.

    Wenn ich das so lese beschleicht mich das gefühl, das du anstatt von string ein char Array verwendest.



  • Da hast du wohl recht mir dem char array.
    Mein Quellcode sieht im Moment folgender maßen aus:

    #define ZEILENLAENGE 459

    void main(void){
    struct Krankenhaeuser {
    char PK[41];
    char IMPORT[13];
    char PKV_PK[41];
    char KZ[7];
    char IK_NR[10];
    char NAME[113];
    char STRASSE_NR[51];
    char PLZ[11];
    char ORT[51];
    char MBKK[6];
    char BPFLV[2];
    char BETTEN_GESAMT[6];
    char BETTEN_BELEGT[6];
    char NAME2[113];
    char Satzende[1];
    } Krankenhaus[20]={0};

    char puffer[ZEILENLAENGE] = {0};
    FILE *Datei;

    int i = 0;
    Datei = fopen("U:\\Versuch.txt","r");

    while(fgets(puffer,ZEILENLAENGE,Datei) != NULL){

    strncpy(Krankenhaus[i].PK,puffer,40);
    strncpy(Krankenhaus[i].IMPORT,puffer+40,12);
    strncpy(Krankenhaus[i].PKV_PK,puffer+52,40);
    strncpy(Krankenhaus[i].KZ,puffer+92,6);
    strncpy(Krankenhaus[i].IK_NR,puffer+98,9);
    strncpy(Krankenhaus[i].NAME,puffer+107,112);
    strncpy(Krankenhaus[i].STRASSE_NR,puffer+219,50);
    strncpy(Krankenhaus[i].PLZ,puffer+269,10);
    strncpy(Krankenhaus[i].ORT,puffer+279,50);
    strncpy(Krankenhaus[i].MBKK,puffer+329,5);
    strncpy(Krankenhaus[i].BPFLV,puffer+334,1);
    strncpy(Krankenhaus[i].BETTEN_GESAMT,puffer+335,5);
    strncpy(Krankenhaus[i].BETTEN_BELEGT,puffer+340, 5);
    strncpy(Krankenhaus[i].NAME2,puffer+345,112);

    i++;
    }
    }

    und das möchte ich etwas einfacher haben. Bin auch für jeden neuen Ansatz dankbar.



  • engele schrieb:

    struct Krankenhaeuser {
    ...
    } Krankenhaus[20]={0};

    char puffer[ZEILENLAENGE] = {0};
    FILE *Datei;

    int i = 0;
    Datei = fopen("U:\\Versuch.txt","r");

    while(fgets(puffer,ZEILENLAENGE,Datei) != NULL){

    ...// Looki nach unten 😉

    i++;
    }
    }

    memcpy(&Krankenhaus[i],puffer,sizeof(Krankenhaeuser));
    

    Tip noch: ZEILENLAENGE kannst du auch durch sizeof(Krankenhaeuser)+1 ersetzen, weil du ja immer ein NullByte als trennzeichen hast, zumindest habe ich das so verstanden.

    😉



  • Danke Burkhi, du warst meine Rettung
    🙂


Anmelden zum Antworten