wie in C/C++ eine "tabellarische" Textdatei erstellen

So, habs endlich geschafft!
Hier meine Lösung:

---------------------------------------------
void main()
{
char buffer[1000]; //Buffer um Zeilen zu speichern
fstream inf("output.txt"); //zum rauslesen aus Textdatei
fstream outf("output.txt"); //zum reinschreiben in Textdatei

for(int i=0; i<AnzahlZeilen; i++)
{
inf.getline(buffer,1000); //buffer = aktuelle Zeile
strcat(buffer, "TESTEN"); //buffer = buffer + "TESTEN"
outf << buffer <<"\t" <<endl; //ausgabe buffer (neu)
}

cout<<"TESTEN in \"output.txt\" hinzugefügt" <<endl<<endl;
outf.close();
inf.close();
}
---------------------------------------------

ACHTUNG: Am Ende der Datei sollte eine leere Zeile sein
RESUME: Immer am Ende der Zeile wird "TESTEN" hinzugefügt und so kann man jede einzelne Zeile durchgehen

Wenn jemand irgendwelche Verbesserungsvorschläge hat: Nur her damit!
gruß
 
Zuletzt bearbeitet:
Hi.

Ist eine nette Idee - aber keinesfalls portabel und es gibt keine Garantie das es überhaupt funktioniert. Bei mir wird z.B. nach ein paar Durchläufen die letzte Zeile überschrieben.

Man sollte auf eine Datei höchstens 1 schreibenden Stream geöffnet haben oder einen bzw. mehrere lesende Streams.

Ich hab mal schnell was geschrieben:
C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iomanip>

#include <cstdlib>

using namespace std;

int main() {
  srand(time(0));   // Zufallszahlen-Sequenz verändern

  // Datei zum Lesen+Schreiben öffnen
  fstream file("tab.txt", ios::out | ios::in);
  
  if (file.is_open()) {
    string line;
    vector<string> lines;
    
    // erstmal die Datei zeilenweise in den Vektor "lines" einlesen.
    while (getline(file, line)) {
      lines.push_back(line);
    }
    
    // {- hier werden die Zeilen verändert. -}
    for (int i = 0; i < lines.size(); ++i) {
      ostringstream formatter;
    
      // an jede Zeile wird ein Leerzeichen und eine Zufallszahl (formatiert) angefügt
      formatter << " " << setw(7) << rand();

      lines[i] += formatter.str();
    }

    file.clear(); // Streamstatus wieder auf "good" setzen
    file.seekp(0); // den Schreibcursor der Datei auf den Dateianfang setzen
    
    // die Elemente des Vektors mit \n getrennt in die Datei kopieren (überschreibt alten Inhalt)
    copy(lines.begin(), lines.end(),
	 ostream_iterator<string>(file, "\n"));    
    
    file.close(); // wieder ordentlich schliessen :)
  } else {
    // Datei existiert nicht oder konnte nicht zum Schreiben+Lesen geöffnet werden.
    cerr << "couldnt open file." << endl;

    return 1;
  }
}

Die main Funktion muss übrigens int zurückgeben.

Gruß
 
Zuletzt bearbeitet:
@deepthroat
jo, da ist irgendwo ein Wurm... es funktioniert aber ab mehreren 100 Zahlen kommt das Programm hin und wieder zum Stolpern...

uiui, deins sieht aber komplex aus (für mich zumindest ;) ). Werde mich mal da dransetzen, falls du paar coments dahinter setzen könntest wäre das super.
greetings


EDIT: wo gebe ich den meine Daten ein? damit diese drangefügt werden können?
 
Zuletzt bearbeitet:
Ok, hab ich gemacht.

Gruß

yeah! habs mal ausprobiert und das klappt ja tadellos Es spielt auch keine Rolle ob man integer, double oder string hat oder so, das wird ja alles automatisch umgewandelt. Super danke!!


aber was ich nicht so ganz verstanden habe sinde folgende Zeilen:

Code:
1) lines[i] += formatter.str();

-was bedeutet das ".str()" am Ende?



Code:
2) copy(lines.begin(), lines.end(),     ostream_iterator<string>(file, "\n"));

-schätze mal am die ersten beiden Ausdrücke bedeuten von ANFANG bis ENDE im Vektor
-aber wie kann man den Rest verstehen da erkenne ich nichts heraus (iterator?)


merci nochmal
 
Hi.
aber was ich nicht so ganz verstanden habe sinde folgende Zeilen:
Code:
lines[i] += formatter.str();
-was bedeutet das ".str()" am Ende?
formatter ist vom Typ std::ostringstream und diese Klasse (siehe http://www.cplusplus.com/reference/iostream/ostringstream/) besitzt die Methode str() um den durch die Ausgabe-Streamoperationen erstellten String zu bekommen.

Für die Klasse std::string gibt es einen += Operator der nichts anderes macht als die Methode append(string) aufzurufen. Man hätte auch schreiben können:
C++:
lines[i].append(formatter.str());

2) copy(lines.begin(), lines.end(), ostream_iterator<string>(file, "\n"));

-schätze mal am die ersten beiden Ausdrücke bedeuten von ANFANG bis ENDE im Vektor
Ja, im Grunde schon. Die Methoden begin() und end() liefern jeweils Iteratoren auf das erste bzw. hinter das letzte Element des Vektors.
-aber wie kann man den Rest verstehen da erkenne ich nichts heraus (iterator?)
std::ostream_iterator ist eine Hilfsklasse aus der Standard Template Bibliothek die einen Iterator für einen Stream und einem bestimmten Typ zur Verfügung stellt.

Für das Konzept eines Iterators siehe http://de.wikipedia.org/wiki/Iterator.

Ansonsten kann ich dir empfehlen ein gutes C++ Buch zu lesen - es lohnt sich ;)

Gruß
 
Zurück