string einlesen, speichern und rückwärts ausgeben



  • danke für die schnellen antworten 🙂 werd das ganze dann mal testen, muss aber erstmal nen programm schreiben, dass ne textdatei einliesst, abspeichert(im speicher als string) und mit ner umrahmung wieder ausgibt 🙂 ^^

    das bekomm ich aber glaube allein hin, das mit datei einlesen hatten wir zwar noch net aber da hab ich ifstream im netz gefunden.

    nur ne kleine anfrage wegen ifstream: wie kann ich dort angeben wo die datei liegt?

    wenn ich bei ifstream die datei so("text.txt")angebe, holt der mir die aus dem projektverzeichnis, und bei ("c:\text.txt") hat der die net von C:\ gelesen. muss man das irgendwie anders eingeben? 😃 bzw. wenn man das ganze variable gestallten will, dann kann ich doch statt ("text.txt") ne variable (string) angeben und vorher lass ich den benutzer halt in den string den dateinamen eingeben, sollte doch so funktionieren oder? na ja teste es gleich mal selbst 😃



  • Wandiii schrieb:

    wenn ich bei ifstream die datei so("text.txt")angebe, holt der mir die aus dem projektverzeichnis, und bei ("c:\text.txt") hat der die net von C:\ gelesen.

    Du musst den String korrekt escapen. Bei "\t" denkt der Compile, das solle ein Tabulatorzeichen sein. Du musst also schreiben "C:\\test.txt", dann klappt es.



  • hmmm irgendwie funzt das net so richtig 🙂

    ich erzeuge nen string

    les dort meinen dateinamne ein

    und geb dann an z.b. ifstream file(datei);
    .
    .
    .

    dann bringt mir der kompiler die fehlermeldung:
    'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const char *,std::_Iosb<_Dummy>::openmode,int)': Konvertierung des Parameters 1 von 'std::string' in 'const char *' nicht möglich
    das sternchen hat wohl was mit zeiger zu tun oder bei const char *? leider haben wir damit noch gar nix gemacht und werden wohl auch nix damit machen ^^ wie kann nun nen variablen dateinamen bei ifstream angeben?



  • der ifstream-Konstruktor kann leider keinen String annehmen. Ruf ihn so auf:

    ifstream file(datei.c_str());
    

    ('datei' sei der String mit dem Dateiname.)



  • Das ist eine der kleinen Inkonsistenzen in der C++ Standardbibliothek, mit der viele erfahrene Programmierer zu leben gelernt haben - std::fstream erwartet den Dateinamen nicht als std::string, sondern als const char* (String im C-Stil). Und die Lösung des Problems ist einfach - wandle deinen String in einen char* um:

    ifstream file(datei.c_str());// die Methode c_str() liefert den Datenpuffer des Strings als char-Array
    


  • vielen dank: hab auch folgenden nützlichen code gefunden

    int main() {
    char dateiname_lesen[10], dateiname_schreiben[10];
    // der Dateiname der Datei, von der wir lesen wollen
    cout << "Dateiname lesen: ";
    cin >> dateiname_lesen;
    // der Dateiname der Datei, in die wir schreiben wollen
    cout << "Dateiname schreiben: ";
    cin >> dateiname_schreiben;
    // Dateien zum lesen/schreiben oeffnen
    ifstream datei_lesen;
    datei_lesen.open( dateiname_lesen );
    ofstream datei_schreiben;
    datei_schreiben.open( dateiname_schreiben );
    // Lies Zeichen von der ersten Datei, bis Datei zu Ende
    // Die Datei wird Zeichenweise gelesen
    while( !datei_lesen.eof() ) {
    char z = datei_lesen.get();
    // rot13-"verschluesselung"
    if( z >= 'A' and z <= 'Z' ) {
    z = (z - 'A' + 13) % 26 + 'A';
    }
    datei_schreiben.put(z);
    }
    // Dateien wieder schliessen
    datei_lesen.close();
    datei_



  • Jetzt solltest du nur noch die Dateinamen in std::string's lesen statt in char-Arrays - selbst wenn du DOS-Namen (8.3) ohne Pfad-Angaben verwendest, dürftest du schon Probleme mit dem verfügbaren Platz für die Eingaben haben.

    (und cin kann nicht überprüfen, wieviel Platz es zum Schreiben hat)



  • ja stimmt, leider wird in vielen ältern büchern bei vectoren, chars etc. immer ne explizite größe angeben 😃 was wirklich zu problemen führen kann.

    den code verwende ich auch net sondern ich versuch mir jetzt selbst was zusammen zu basteln



  • so ich hätte nun noch ne kleine fragen, wegen dem ersten programm:

    ich hab es jetzt geschafft, die textdatei in nen vector einzulesen (das ganze in eine funktion gepackt), dann frag ich noch die größe des vektors ab und lass mir die max. zeilenbreite dazu berechnen.

    nun soll noch ne umrahmung dazu. nehmen wir mal an 1 leerzeichen oben, unten und an jeder zeite und ganz aussen sternchen.

    die erste zeile ausgeben ist ja einfach alles sterne, die zeite zeile am rand sterne und in der mitte leerzeichen

    nächste zeile (erste textzeile) wieder stern am rand, dann berechne ich mir mit leervor = (maxstringlaenge-lange aktueller string +2) / 2 die leerzeichen vor dem string (bei ungeradem ergebnis, nehm ich nur den ganzzahlteil, weil dann kann ich die textzeile eh nicht ganz zentrieren)(text) dann geb ich den textstring aus, dann berechne ich (maxlaenge + 2)-leervor - textstring.

    das ganze sollte doch so funktionieren oder? 😃



  • CStoll schrieb:

    Das ist eine der kleinen Inkonsistenzen in der C++ Standardbibliothek

    Inkonsistent? IMHO wird konsistent auf std::string verzichtet.



  • so, hab noch so meine kleine probleme mit der zweiten aufgabe:

    ich soll ne Klasse implementieren, welche nen textstring einliest, abspeichert und dann rückwärts ausgibt.

    ich definiere alse ne class string_verarbeitung

    private würd ich halt den string zeile; setzten

    dann würde ich public: einmal ne funktion schreiben, welche von der tastatur in den string einliest und somit auch abspeichert

    nun soll das ganze aber rückwärts ausgegeben werden, ich hab mal wo gelesen, dass ich mich durch iteratoren durch nen string hangeln kann, dann würde ich die größte des strings abfragen, dann den iterator dorthin setzten und solang durch den string gehen bis ich auf ein leerzeichen treff, das würd ich ausgeben usw. bis mein iterator bei 0 angekommen ist. aber wie mach ich das ganze?

    hoffe einer kann mir um die uhrzeit noch helfen 😃


Anmelden zum Antworten