Array
-
Hey Leute,
hab da mal ne frage und zwar folgendes:
#include <iostream> #include <stdio.h> #include <string> #include <stdlib.h> using namespace std; struct T_Satz{ char cNachname[13]; char cVorname[13]; char cTelefon[15]; }; int main (void){ string sLinie (65, '='); char cFrage; T_Satz sEintrag; FILE *pFile; pFile = fopen ("Nummern.dat","a"); do{ system("cls"); cout << sLinie << endl; cout << "Bitte geben Sie Ihren Vornamen ein :"; cin >> sEintrag.cVorname; cout << endl; cout << "Bitte geben Sie Ihren Nachnamen ein :"; cin >> sEintrag.cNachname; cout << endl; cout << "Bitte geben Sie Ihre Telefonnummer ein :"; cin >> sEintrag.cTelefon; cout << endl; cout << sLinie << endl; if (pFile!=NULL) { fputs(sEintrag.cVorname, pFile); fputs(" ", pFile); fputs(sEintrag.cNachname, pFile); fputs(" ", pFile); fputs(sEintrag.cTelefon, pFile); } cout << endl; cout << endl; cout << "Neuer Eintrag? (j/n)"; cin >> cFrage; }while(cFrage == 'j' || cFrage == 'J'); fclose(pFile); cin.get(); cout << "Liste anzeigen? (j/n)"; cin >> cFrage; if(cFrage == 'j' || cFrage == 'J'){ pFile = fopen ("Nummern.dat","r"); while(fread(&sEintrag, 1, sizeof(sEintrag), pFile) != 0){ cout << sEintrag.cVorname << sEintrag.cNachname << sEintrag.cTelefon << endl; }; fclose(pFile); }else{ fclose(pFile); return 0; } }
wenn man sich hier die Datei anzeigen lässt bzw. in der Konsole ausgibt
kommen wirre zeichen und/oder wiederholung der vorherigen zahlen, nun meine
Frage:
Wie kann ich herrausfinden wieviele Felder eines Arrays vollgeschrieben sind
(mit dem was ich will) und dann die Array-Größe anpassen kann?
MFG noobish-n3rd
-
Dein Programm ist halb C und halb C++ (naja etwas mehr C als C++).
Hier dein Programm mal in halbwegs normales C++ portiert. Nicht perfekt, aber immer noch um Welten besser:#include <iostream> #include <fstream> #include <vector> struct Person { std::string vorname, nachname; std::string telefonnummer; }; std::istream& operator>>(std::istream& i, Person& p) { std::cout << "Vorname: "; i >> p.vorname; std::cout << "Nachname: "; i >> p.nachname; std::cout << "Telefonnummer: "; i >> p.telefonnummer; return i; } std::ostream& operator<<(std::ostream& o, Person& p) { return o << p.vorname << ' ' << p.nachname << ", tel: " << p.telefonnummer << '\n'; } int main() { std::vector<Person> liste; do { std::cout << "\n1: Person hinzufuegen\n" "2: Liste anzeigen\n\n>> "; int wahl; std::cin >> wahl; if(wahl == 1) { Person p; std::cin >> p; std::ofstream datei("daten.dat", std::ios::app); datei << p; } else { std::ifstream datei("daten.dat"); char c; while(datei.get(c)) std::cout << c; } } while(true); }
Stichworte:
- C++ Dateioperationen mit fstream
- Operatorüberladung (Ein- und Ausgabeoperatoren, Shift Operatoren) C++
- Der STL-Container std::vector
-
Echt ? also so hab ich es in der Schule gelernt wusste nicht das das
Halb C und halb C++ ist
wenn ich "using namespace std;" mache kann ich doch das std:: vor jedem output
weg lassen oder?
-
In C++ verwendet man die echt coolen filestreams. Kein fputs oder FILE oder was weiß ich, das kommt alles noch aus C. Außerdem werden Zeiger allgemein in C++ sehr selten benutzt.
Deine Struktur zur Verwaltung der Daten ist zwar sinnvoll, aber zum einen verwendest du ungarische Notation und zum anderen diese alten C-Strings.
Ungarische Notation wird ungern gesehen (google das mal) und statt dieser blöden Array's von char verwendest du besser gleich immer std::string.Und klar geht das so mit using namespace std. Aber google mal den eigentlichen Sinn von Namespaces. Diese using namespace-Direktiven sparen zwar Tipparbeit. Aber wenn du dir alles von einem Namespace her holst, wozu sollte man dann noch einen Namespace machen? Der eigentliche Sinn dieser Namespaces ist ja vor allem das Verhindern von Namenskollisionen, und wenn du dir einfach alles holst geht das ja nicht mehr.
Lokal in einem lokalen Scope kann man sich damit tatsächlich Tipparbeit ersparen, aber gleich für eine ganze Datei? Oder wenn du dieses using namespace std in eine Headerdatei schreibst, wird alles aus dem Scope in der Header sichtbar, und wenn du die dann irgendwo inkludierst, wird auch in der inkludierenden Datei alles sichtbar. Also lieber nicht in HEadern hinschreiben.