Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Struct in Datei speichern, zugriff via Array/Pointer zum ändern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.09.2009, 21:30 Uhr
checkit



Hallo,

wir zwei müssen eine Semesterabeit programmieren und scheitern schon an den elementarsten Aufgaben.
Seit mehr als 2 Tagen versuchen wir die Daten einer Personalerfassungsmaske in eine .txt-Datei abzulegen, auf welche wir später wieder zugriff haben, um allfällige Änderungen vorzunehmen.
Was machen wir falsch? Nichts läuft richtig und wir haben schlicht keine Ahnung, wo wir überhaupt mit einem Lösungsansatz beginnen können.
Vielen Dank für Eure Hilfe

Remo/Dominik


C++:
#include <stdlib.h>
#include <fstream.h>

const short MAXCHAR = 30;
const short MAXPERS = 500;

struct datum
{
    int monat;
    int jahr;
};

struct pers
{
    char name[MAXCHAR];
    char vorname[MAXCHAR];
    char adresse[MAXCHAR];
    char nummer[3];
    char plz[4];
    char ort[MAXCHAR];
    datum Edatum; // Fehler
};

void Eingabe (pers onal)  
{
    cout<<endl<<endl;
    cout<<"Name ";
    cin>>onal.name;
    cout<<"Vorname ";
    cin>>onal.vorname;
    cout<<"Adresse (z.B. Musterstrasse) ";
    cin>>onal.adresse;
    //cout<<"Nummer "
    //cin>>onal.nummer;
    cout<<"PLZ ";
    cin>>onal.plz;
    cout<<"Ort ";
    cin>>onal.ort;
    cout<<"Eintritt (mm jjjj) ";
    cin>>onal.Edatum.monat>>onal.Edatum.jahr;
    cout<<endl;
    return;
}

void speichern(pers *ein, int anz)
{
    ofstream f_schreiben;
    f_schreiben.open("huge.txt", ios::binary);
    if(!f_schreiben)
    {
        cout<<"fehler";
        cin.sync();
        cin.get();
        return;
    }
    //cout<<"speichern "<<onal[0].name<<endl;
    f_schreiben.write((char *)ein, anz);
    f_schreiben.close();
}

void einlesen(pers *aus, int anz)
{
    ifstream f_lesen;
    f_lesen.open("huge.txt", ios::binary);
    if(!f_lesen)
    {
        cout<<"fehler";
        cin.sync();
        cin.get();
        return;
    }
    f_lesen.read((char *)aus, anz);
    f_lesen.close();
}

void ausgeben(pers *aus, int anz)
{
    for(int i=0;i < anz ; i++)
    {
       cout<< aus[i].name<<"  ";
       cout<< aus[i].vorname<<"  ";
       cout<< aus[i].adresse<<"  ";
       cout<< aus[i].nummer<<"  ";
       cout<< aus[i].plz<<"  ";
       cout<< aus[i].ort<<"  ";
       //cout<< aus[i].Edatum.datum<<"  ";
       cout<<endl;
    }
}




void main ()
{
    pers Eingabe[10];
    pers Ausgabe[10];
    speichern (Eingabe, sizeof(Eingabe));
    einlesen (Ausgabe, sizeof(Eingabe));
    ausgeben (Ausgabe, 10);
    cin.sync();
    cin.get();
    return ;
}




Bearbeitung von Hans:
cpp-Tags eingefügt und Formatierung verbessert.

Dieser Post wurde am 04.09.2009 um 03:51 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.09.2009, 03:46 Uhr
Hans
Library Walker
(Operator)


Hi,

als erstes solltet Ihr mal auf die Fehlermeldungen gucken, die der Compiler Euch gibt. Wichtigste Vorgehensweise dabei: Immer zuerst die oberste Meldung betrachten und den Fehler beheben. Alle anderen Meldungen können (müssen aber nicht) Folgefehler sein, die aus dem Ersten Fehler resultieren.

Dann ist die Frage, was Ihr mit #include <stdlib.h> wollt? - Euer Programm ist in C++ geschrieben, stdlib.h ist aber ein C-Header. Für C++ müsste es #include <cstdlib> heissen; ich hab jetzt auf die Schnelle aber keine Funktion aus (c)stdlib gefunden.

Und wie man Strukturvariablen erzeugt, solltet Ihr Euch auch noch mal genauer ansehen.

Diese Meldung:

C++:
    f_lesen.open("huge.txt", ios::binary);
    if(!f_lesen)
    {
        cout<<"fehler";  //  <<<< Hier


ist auch nicht sehr aussagekräftig, weil man nämlich nicht erfährt, wo der Fehler aufgetreten ist, und was für ein Fehler das ist.

Dann noch eine simple Frage der Logik:

C++:
void main ()
{
    pers  Eingabe[10];
    pers  Ausgabe[10];
    speichern (Eingabe, sizeof(Eingabe));
    einlesen (Ausgabe, sizeof(Eingabe));
    ausgeben (Ausgabe, 10);
    cin.sync();
    cin.get();
    return ;
}


Ihr wollt also Daten abspeichern, die hinterher erst eingelesen werden? - Wie soll das denn gehen??

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.09.2009, 15:05 Uhr
öni



Hi, also als Header hätte ich mal die verwendet (damit es Fehlerfrei compiliert)

C++:
#include <iostream>
#include <fstream>
using namespace std;


wenn man nun noch auf Hans Post eingeht und den Punkt verbessert das man erst einliest oder eingibt bevor man speichert, würde ich noch beachten das du dein struct ja nicht einfach so

C++:
f_lesen.read((char *)aus, anz);

einlesen kannst sondern zeile für zeile oder wert für wert einlesen solltest. Die Zeile die ihr geschrieben habt liest nämlich nur die im zweiten Parameter übergegeben Anzahl von Zeichen ein und speichert sie in den ersten Parameter.

Dieser Post wurde am 06.09.2009 um 15:06 Uhr von öni editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: