C++ Strings in .txt speichern

Nebuk

Lieutenant Pro
🎅Rätsel-Elite ’11
Registriert
Sep. 2009
Beiträge
942
Hallo zusammen

Bin mal wieder am basteln. Leider finde ich den Fehler nicht so ganz. Ich bin aber guter Dinge, dass ihr Profis ihn sicher sofort findet :D

OK, hier wäre der Code:

Code:
#include <iostream>
#include <stdlib.h>
#define MAX 255

using namespace std;

void write(char &eingeben)
{
  FILE *fp = fopen("test.txt", "w");    // öffnen mit schreibrecht
  if (fp == NULL)                       // falls Datei nicht korrekt gelesen
  {
    cout << "Problem beim Erstellen des Files" << endl;
  }
  
  fputs(&eingeben, fp);     // schreibt den String in eine Datei
  fputc('\n', fp);          // Zeilenumbruch erzeugen
  
  fclose(fp);               // schliesst das File wieder
}


int main(int argc, char *argv[])
{
  char eingeben[MAX];       // Variablendefinition String
  
  int anz = 0;
  
  cout << "wieviele Strings einlesen? > ";
  cin >> anz;               // Angabe anzahl zu erstellenden Strings
  
  for(int i = 0; i < anz; i++)
  {
    cout << "Bitte Text eingeben ";
  
    cin >> &eingeben[i];      // Eingabe des Strings
  
    write(*eingeben);         // Aufruf der Funktion zum in Datei schreiben
  }
  
  system("PAUSE");	
  return 0;
}

Kurz gesagt, soll das Programm eine zu bestimmende Anzahl Strings in eine Textdatei speichern.

Dies tut es auch fast, nur wenn ich z.B. 3 Strings einlese, so erscheinen nur jeweils die ersten Buchstaben der ersten beiden Strings und der letzte wird komplett übernommen.

Was muss ich ändern, damit es auch die anderen Strings komplett in die Datei schreibt?

PS. Eine zweite Frage hätte ich auch noch. Wie bringe ich es hin, dass ich Leerzeichen in Strings mit abspeichern kann? Also sowie:

cin str >> Hallo Computerbaseforum;

Hab was mit "getline (cin,str);" gefunden, nur funktioniert es nicht so ganz... hab da wohl was falsch gemacht?
 
versuch mal folgende zeilen so zu verändern
das "a" bewirkt das du am ende der datei zu schreiben beginnst (also den text "anhängst")

Code:
void write(const char* eingeben)

  FILE *fp = fopen("test.txt", "a");

  fputs(eingeben, fp);

    cin >> eingeben;
    write(eingeben);
 
Ok, danke für die Antwort!

Wenn ich nun 5 Zeilen eingebe, mit "Test", "eins", "zwei", "drei", "vier" so kommt folgendes heraus:

test
teins
tezwei
tezdrei
tezdvier

Es schreibt zwar alle Wörter rein, doch hängt es immer den ersten Buchstaben des jeweils vorherigen Wortes an das nachfolgende Wort.

Das anhängen ist aber auch nicht genau das was ich eigentlich möchte. Es soll nämlich nur das eingegebene in die Datei speichern und beim nächsten eingeben soll wieder alles überschrieben werden.

Aber immerhin komme ich so ein Stück näher ans Ziel :D
 
Wieso nutzst du eigentlich keine Datei-Streams, wenn du schon C++ einsetzst?
 
Hm. In der Schule haben wir diese Methode verwendet. Wie könnte ich es mit dieser Variante machen?
 
Also bei geschätzt 1,5 Mio Code-Beispielen im Internet wirst du sicher was bei Google finden, wenn es dich interessiert..
 
Kommentare befinden sich im Code:

int main(int argc, char *argv[])
{
char eingeben[MAX]; // Variablendefinition String

Hier erstellst du eine String-Variable mit einer zulässigen Länge von 255. Das kannst du aber auch direkt hier initialisieren und musst nicht über ein fest definiertes MAX gehen. Ist aber nur ne Stilfrage.

int anz = 0;

cout << "wieviele Strings einlesen? > ";
cin >> anz; // Angabe anzahl zu erstellenden Strings

for(int i = 0; i < anz; i++)
{
cout << "Bitte Text eingeben ";

cin >> &eingeben; // Eingabe des Strings

Hier schreibst du dann den ersten String beginnend bei Index 0 deiner Variable

write(*eingeben); // Aufruf der Funktion zum in Datei schreiben

Und genau hier ist dein Problem. Beim ersten Vorgang beginnst du bei Index 0 und schreibst den ersten String. Dieser wird dann per write() in die Datei geschrieben. Beim zweiten mal beginnst du aber bei Index 1 mit dem neuen String, also bleibt der erste Buchstabe des alten Strings weiterhin vorhanden. Das läuft so weiter bis zum Ende deiner Schleife. Ersetze das &eingeben; durch &eingeben[0]; dann funktioniert es.

}

system("PAUSE");
return 0;
}
 
Zuletzt bearbeitet:
@Serialkiller: Danke für deine Antwort

Du meinst also ich soll
Code:
cin >> &eingeben[i];
durch
Code:
cin >> &eingeben[0];

ersetzen?

Wenn ich das mache, so wird nur jeweils der letzte String gespeichert :(
 
Wie gespeichert?

Du speicherst hier doch rein gar nix, außer deine aktuelle Variable und die schreibst du doch sofort wieder in die Datei.

Das Problem ist wie gesagt der Index, an dem du mit dem Schreiben beginnst. Du musst immer bei Index 0 beginnen, sonst hast du auf den vorangehenden Indizes noch die chars, der vorangegangenen Strings.

In deinem Beispiel stammt der erste Buchstabe von String 0, der zweite von String 1, der dritte von String 2, usw.
 
Ja, ich meine natürlich schreiben, nicht speichern...

Code:
#include <iostream>
#include <stdlib.h>
#define MAX 255

using namespace std;

void write(char &eingeben)
{
  FILE *fp = fopen("test.txt", "w");    // öffnen mit schreibrecht
  if (fp == NULL)                       // falls Datei nicht korrekt gelesen
  {
    cout << "Problem beim Erstellen des Files" << endl;
    exit(0);
  }
  
  fputs(&eingeben, fp);     // schreibt den String in eine Datei
  fputc('\n', fp);          // Zeilenumbruch erzeugen
  
  fclose(fp);               // schliesst das File wieder
}


int main(int argc, char *argv[])
{
  char eingeben[MAX];       // Variablendefinition String
  
  int anz = 0;
  
  cout << "wieviele Strings einlesen? > ";
  cin >> anz;               // Angabe anzahl zu erstellenden Strings
  
  for(int i = 0; i < anz; i++)
  {
    cout << "Bitte Text eingeben ";
  
    cin >> &eingeben[[COLOR="Red"][B]0[/B][/COLOR]];      // Eingabe des Strings
  
    write(*eingeben);         // Aufruf der Funktion zum in Datei schreiben
  }
  
  system("PAUSE");	
  return 0;
}

So meint ihr doch? Wenn ich es kompiliere und danach starte so schreibt es mir aber nur der zuletzt eingegebene String in die Textdatei. :-(
 
#include <iostream>
#include <stdlib.h>
#define MAX 255

using namespace std;

void write(char eingeben) Hier das "&" weglassen
{
FILE *fp = fopen("test.txt", "w"); // öffnen mit schreibrecht
if (fp == NULL) // falls Datei nicht korrekt gelesen
{
cout << "Problem beim Erstellen des Files" << endl;
exit(0);
}

fputs(eingeben, fp); // schreibt den String in eine Datei

Hier das "&" weglassen

fputc('\n', fp); // Zeilenumbruch erzeugen

fclose(fp); // schliesst das File wieder
}


int main(int argc, char *argv[])
{
char eingeben[MAX]; // Variablendefinition String

int anz = 0;

cout << "wieviele Strings einlesen? > ";
cin >> anz; // Angabe anzahl zu erstellenden Strings

for(int i = 0; i < anz; i++)
{
cout << "Bitte Text eingeben ";

cin >> eingeben[0]; // Eingabe des Strings

Hier auch das "&" weglassen

write(*eingeben); // Aufruf der Funktion zum in Datei schreiben

Da ich nur Java, C# und VB schreibe, weiß ich nicht, ob das Sternchen dableiben muss oder nicht. Probier es aus.

}

system("PAUSE");
return 0;
}
 
Wenn ich die "&" entferne, so lässt es sich nicht kompilieren...

cin >> eingeben[0]; // hier gibt es einen Fehler an
 
Du brauchst das & auch gar nicht bei einem Array...

es reicht vollkommen
cin >> eingeben;
 
Stimmt, habe ich jetzt abgeändert und oben noch angepasst. Leider lässt sich dadurch das Problem ja auch nicht beheben :-)
 
Klar, wenn die Datei im falschen Modus geöffnet wird...

w überschreibt die Datei... du brauchsst den "append"-Modus...

Und ich würde sagen die Funktion sollte so aussehen
Code:
void write(char *eingeben)
{
  FILE *fp = fopen("test.txt", "at");    // öffnen mit schreibrecht
  if (fp == NULL)                       // falls Datei nicht korrekt gelesen
  {
    cout << "Problem beim Erstellen des Files" << endl;
    exit(0);
  }
  
  fputs(eingeben, fp);     // schreibt den String in eine Datei
  fputc('\n', fp);          // Zeilenumbruch erzeugen
  
  fclose(fp);               // schliesst das File wieder
}

Der Aufruf dann einfach "write(eingeben);"

Der Parameter muss zwingend ein Zeiger sein (oder wie es schon war notfalls ne Referenz, aber ich würde nen Zeiger nehmen, weil Arrays schon von Haus aus Zeiger sind).
 
Zuletzt bearbeitet:
Zurück
Oben