Aus Struktur in Text Datei mit Trennparameter zum Wiederauslesen schreiben

cecho

Grünschnabel
Wie der Titel schon sagt - ich lese per Struktur 4 Eigenschaften wie z.B. Größe, Gewicht etc. ein, aber wie kann ich diese in eine .txt Datei speichern?

Die Größe des Strings fixen, oder einen Trennparameter setzten, sodass er weiß, wenn ich nur die Größe eines Namens auslesen will bis zu welchem char er lesen soll?

Nehmen wir mal an, ich hätte:


Code:
struct Menschen{
int größe;
string name;
int gewicht;
}

for (i=0; i<n, i++){
getline(cin, person[i].größe);
getline(cin, person[i].name);
getline(cin, person[i].gewicht);

//hier müssten die dinger reingeschrieben werden, mit fstream evtl? Da es mehrere Personen sind können die Lines ja unterschiedlich lang sein, und ich will (muss) pro Person eine Zeile rechnen
}

Danke schonmal für Ideen oder Beispiele :)
 
Hi

wenn du für die drei Variablen drei getline verwendest hast du pro Person ja drei Zeilen.
Entsprechend auch schreiben.
Das "Trennzeichen" ist der Zeilenwechsel,
 
Jaein das ist eig. nicht mein Problem oder wir reden aneinander vorbei... ;)
Code:
fstream e;
e.open("txt.txt", ios::out|ios::app);
e << person[i]name << person[i]gewicht << endl;
e.close();

Jetzt stehen die in der Datei.
Nach dem restart des Programmes sollen diese aber wieder eingelesen werden, sodass ich z.B. mit
Code:
cout << endl << person[x]name << endl;

genau auf die info zugreifen kann. :)

evtl mit cout.width die maximale länge für den string angeben?
oder mit "|" die einzelnen sachen trennen... aber wie auf ein exaktes zugreifen?
Zeile mit Zähler runterrechnen und dann Zeile 2 ausgeben geht ja - aber Zeile 2 Element 3 z.B. halt dann. :)
 
Hallo,

sheel meinte, dass du jedes Attribut in eine eigene Zeile schreibst, also z.B. so:

C++:
std::ofstream ofs("personen.txt");
for (int i = 0; i < n; ++i) {
  ofs << person[i].größe << std::endl
      << person[i].name << std::endl
      << person[i].gewicht << std::endl;
}
ofs.close();

Zum Auslesen kannst du dann std::getline verwenden und mittels std::istringstream in den richtigen Datentypen parsen:

C++:
std::ifstream ifs("personen.txt");
for (int i = 0; i < n; ++i) {
  std::string zeile;

  std::getline(ifs, zeile);
  std::istringstream(zeile) >> person[i].größe;

  std::getline(ifs, person[i].name);

  std::getline(ifs, zeile);
  std::istringstream(zeile) >> person[i].gewicht;
}

Grüße,
Matthias
 
Soweit klar - hatte ich bis jetzt auch so, aber die Aufgabe ist halt nun, dass er alle Attribute in eine Zeile schreibt, und per ieinem Trennparameter die richtige Eigenschaft findet :)
 
Hallo,
wenn du den Operatpr >> nutzt dann ist es egal ob Zeilenwechsel oder Newline. Ich würde dir dann nur empfehlen denn >>-Operator so zu überladen, dass er genau die Anzahl an Eigenschaften auch einließt, dann bist du beim nächsten benutzen automatisch in der nächsten Zeile. So brauchst du auch kein Trennzeichen, bzw das Newline-Zeichen entspräche dem Trennzeichen, worauf du aber nicht gesondert reagieren musst.

Gruß Jennesta
 
Entweder ich versteh euch falsch, oder ich kapier es nicht so ganz :)

Also in der Textdatei sollte es z.B. so aussehen:

Jürgen91weiß1.95
Fabian95schwarz1.40

und rauslesen soll re dann z.B. das Gewicht von Jürgen 91.

EDIT:

Also alle Usereigenschaften sollen in einer Zeile sein - so lautet das Ziel :)
 
Hi.

Du kannst bei getline auch ein anderes Trennzeichen angeben - das \n ist nur die Voreinstellung.

\edit: Du müßtest natürlich beim Reinschreiben auch tatsächlich irgendein Trennzeichen verwenden, sonst kriegst du die Daten niemals wieder auseinander dividiert.

Gruß
 
Bei mir wäre das Trennzeichen jetzt ein Pfeil, wie würde dann das auslesen ausschauen? mir ist nicht so ganz ersichtlich wie er das aus einer txt Zeile:

Jürgen|1.95|braun|62

ausliest und reinspeichert....

Danke schonmal für die Geduld :)

Und ich krieg nen Errortext der sagt "no match for operator>> in std:basic_istringstream ;)
 
Zuletzt bearbeitet:
Beispiel:
C++:
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>

using namespace std;


struct Menschen {
  int groesse;
  string name;
  int gewicht;
};

// Reinschreiben

ostream& operator<<(ostream& out, const Menschen& m) {
  return out << m.groesse << '|' << m.name << '|' << m.gewicht << endl;
}

// Hilfsfunktionen

struct expect_t {
  char c;
};

istream& operator>>(istream& in, expect_t e) {
  char x;
  if (in.get(x) && x != e.c) in.setstate(ios::failbit);
  return in;
}

expect_t expect(char c) {
  expect_t ret = { c };
  return ret;
}

// Auslesen

istream& operator>>(istream& in, Menschen& m) {
  return getline(in >> m.groesse >> expect('|'), m.name, '|')
    >> m.gewicht >> expect('\n');
}

int main(void) {
  Menschen mensch = { 180, "Paul", 70 }, p;

  stringstream io;

  io << mensch;
  if (io >> p) {
    cout << p;
  }
}
 

Neue Beiträge

Zurück