zeilen in Text datei ändern

So, nun hat es fast geklappt, noch ein kleiner Fehler ist drin....

Wenn ich den Text eingebe speichert es ihn, aber wenn im text eine "Lehrschlag" drin ist, dann stürzt mir das Program ab und ich weiss nicht wieso?

Besten Dank schon mal für deine Gedult.

Ich bin schon richtig stolz auf mich dass ich es so weit geschafft habe.

Hier noch der Code wenn du mir nochmals drüber schauen kannst...

Code:
int aendern()
{
  
  char zeilentext[101];  
  int zeile;
  
  
  
  fstream in("Ablage.txt");
 
  if (!in.is_open()) {
    cerr << "Datei kann nicht geoeffnet werden.";
    return 1;
  }
 
  string line;
  vector <string> content;
 
  cout << Abst <<"Eingabe der Zeilennummer:"; 
  cin  >> zeile;
  
                   
 
  while (getline(in, line)) {
      content.push_back(line);
    }
   cout << Abst << "Aktueller Inhalt der Zeile " << zeile << ": " << content[zeile-1] <<endl;
 
 
  cout << Abst << "Neuer Text der Zeile:";
  
  cin  >> zeilentext;
  
  content[zeile-1] = zeilentext;
  
  
  in.close();
  in.clear();
 
 
  in.open("Ablage.txt", ios::out | ios::trunc);
  
  
  while (getline(in, line)) {
      content.push_back(line);
  }
  
  
  in.clear();
  in.seekp(0);
  
 
     copy(content.begin(), content.end(),
     ostream_iterator<string>(in, "\n"));
     

    
}


Gruss
 
Ich bin schon richtig stolz auf mich dass ich es so weit geschafft habe.
Leider hast du anscheinend nur noch überhaupt keine Ahnung von dem was du dort tust. Du müßtest dich doch mal fragen und überlegen was die einzelnen Anweisungen überhaupt bedeuten... :confused:
Code:
char zeilentext[101];
Da du mit C++ arbeitest, solltest du ruhig std::string verwenden:
C++:
string zeilentext
Du kannst dir die Variable aber auch gleich ganz sparen.
Code:
  cout << Abst <<"Eingabe der Zeilennummer:"; 
  cin  >> zeile;
Eingaben sollten immer geprüft werden. Wurde hier wirklich etwas eingelesen? Nebenbei sollte die Variable zeile nur positive Werte haben können. (unsigned)
C++:
if (cin >> zeile) {
   // hier kanns weitergehen...
} else {
   // fehler
   return 1;
}
Code:
cout << Abst << "Aktueller Inhalt der Zeile " << zeile << ": " << content[zeile-1] <<endl;
Woher weißt du das die Eingabe der Zeile nicht zu groß war? Prüfen! (Das ist übrigens auch der Grund des Absturzes - zumindest falls du die Funktion aendern öfter aufrufst)
C++:
if (zeile >= content.size()) {
  // Fehler 
  return 1;
}
Code:
  cin  >> zeilentext;
Wie du bereits gemerkt hast liest du damit nur ein einzelnes Wort ein. Wofür könnte denn wohl die Funktion getline gut sein, die du bereits die ganze Zeit verwendest? ;-]

Wie gesagt, man kann die Zeile auch gleich direkt in den vector speichern:
C++:
if (getline(cin, content[zeile-1]) {
   // Einlesen war OK, jetzt können wir die Daten speichern
} else {
   // Fehler, Datei zu überschreiben wäre sinnlos
  return 1;
}

Code:
  in.close();
  in.clear();
  
  in.open("Ablage.txt", ios::out | ios::trunc);
    
  while (getline(in, line)) {
      content.push_back(line);
  }
Hier hast du jetzt überhaupt nicht nachgedacht. Wozu ist diese Schleife jetzt gut? Nochmal: die Option ios::trunc bewirkt das der Inhalt der Datei beim Öffnen gelöscht wird, die Datei ist also gleich nach dem Öffnen leer, also 0 Byte groß. Welchen Sinn macht dann diese Schleife? Und was könnte die Option ios::out wohl bedeuten? Evtl. wird die Datei nur zur Ausgabe geöffnet... :confused:

Gruß
 
Zuletzt bearbeitet:
Hallo

Ich bin es dem einfach nicht, habe lange probiert aber sehe nicht das Problem.

Habe immer wieder deine Texte durchgelesen um zu verstehe was du mir erklären willst, aber ich bin einfach noch zu unerfahren...
z.b. hier...

Code:
if (getline(cin, content[zeile-1]) {
   // Einlesen war OK, jetzt können wir die Daten speichern
} else {
   // Fehler, Datei zu überschreiben wäre sinnlos
  return 1;
}

Bei dem Befehl cin weiss ich nicht wie du meinst, dass ich den Text eingeben kann, wenn ich es so mache, kann ich nichts eingeben. Ich habe mal das verbessert was ich verstanden habe, aber sieh selbst was ich meine...

Code:
int aendern()
{
  
  string zeilentext;  
  int zeile;
  
  
  
  fstream in("Ablage.txt");
 
  if (!in.is_open()) {
    cerr << "Datei kann nicht geoeffnet werden.";
    return 1;
  }
 
  string line;
  vector <string> content;
 
  cout << Abst <<"Bitte die Nr. der Zeile angeben die Sie aendern moechten:"; 
  
  if (cin >> zeile) 
  {
          
  } 
      else 
      {
      // fehler
      return 1;
      }
  
                   
 
  while (getline(in, line)) {
      content.push_back(line);
  }
  
  cout << Abst << "Aktueller Inhalt der Zeile " << zeile << ": " << content[zeile-1] << endl;
 
 
  cout << Abst << "Nun geben Sie den neuen Text ein fuer die Zeile:";
  
  
  if (getline(cin >> zeilentext, content[zeile-1]))
  
  {
                  
   content[zeile-1] = zeilentext;
   
  } 
  
      else
      {
      
      return 1;
      }
  
    
  
  in.clear();
  in.seekp(0);
  
 
     copy(content.begin(), content.end(),
     ostream_iterator<string>(in, "\n"));
  
  
 
    

    
}



Gruss
 
Hi.

Bevor du nun alles wieder falsch verstehst, gebe ich offiziell auf.
C++:
int aendern() {
  unsigned int nr;
  string line;

  fstream file("Ablage.txt", ios::in);

  if (!file.is_open()) {
    return 1;
  }
  vector<string> content;

  while (getline(file, line)) {
    content.push_back(line);
  }

  cout << "Zeilennummer (1-" << content.size() << "): ";
  if (cin >> nr && nr >= 1 && nr <= content.size()) {
    --nr;
    cin.ignore(1 << 13, '\n');
  } else {
    return 1;
  }

  cout << "Neue Zeile: ";
  if (!getline(cin, content[nr])) {
    return 1;
  }
  
  file.close();
  file.clear();
  
  file.open("Ablage.txt", ios::out | ios::trunc);

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

  return 0;
}
Falls das bei dir nicht funktioniert, dann hast du noch andere Fehler im Programm.

Außerdem wäre es natürlich viel sinnvoller, falls du die Zeilen mehrfach im Programm ändern willst, die Datei gleich zu Beginn des Programms einzulesen und nur den vector zu verändern, und kurz vor Ende des Programms wieder zu speichern.

Gruß
 
Danke vielmals, die Funktion funktioniert einwandfrei.
Jetzt muss ich nur noch nachschlage was das Programm im einzelnen macht...

Das mit der Zeilenmengen Angabe finde ich auch super, wäre nicht auf die gute Idee gekommen.


Danke und Gruss
 
Zurück