Aus Textdatei einzelne Zeichen auslesen



  • Hey ihr Profis,
    ich habe aktuell folgendes Problem: Ich habe ein Programm geschrieben, dass eine Datei über http herunterlädt und sie als Textdatei speichert. Das funktioniert soweit auch.
    Nun möchte ich aber in einem anderen Proggi, dass eine Textdatei einliest(in dem Fall die von oben) eine bestimmte Zeichenkette die in Zeile X von Zeichen Y bis Zeichen Z sitzt, in einen seperaten String(oder meinetwegen auch char-Array) gespeichert wird.
    Wie realisier ich das jetz?

    LG
    BlackCubeX



  • BlackCubeX schrieb:

    Hey ihr Profis,
    ich habe aktuell folgendes Problem: Ich habe ein Programm geschrieben, dass eine Datei über http herunterlädt und sie als Textdatei speichert. Das funktioniert soweit auch.
    Nun möchte ich aber in einem anderen Proggi, dass eine Textdatei einliest(in dem Fall die von oben) eine bestimmte Zeichenkette die in Zeile X von Zeichen Y bis Zeichen Z sitzt, in einen seperaten String(oder meinetwegen auch char-Array) gespeichert wird.
    Wie realisier ich das jetz?

    LG
    BlackCubeX

    Sehr einfach.

    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <string>
    
    int main()
    {
        using std::string;
        using std::vector;
    
    /////////////////////////////////////////
        std::ofstream o("DeineDatei.html", std::ios::trunc|std::ios::out);//Zum Test!!
        o << "Hallo\nHier\nBin\nIch";      //
        o.close();                         //
    /////////////////////////////////////////
    
    ////////////////////////////////////////Eigentlicher Code
        vector<string> zeilen(1);    //
        for(std::fstream stream("DeineDatei.html");!stream.eof();zeilen.push_back(string()))
            std::getline(stream, zeilen.back());//
    ////////////////////////////////////////
    
    ////////////////////////////////////////TEST
        for(vector<string>::iterator iter(zeilen.begin());iter != zeilen.end();++iter)//Edit: für nicht-c++11 Compiler
            std::cout << *iter << '\n';
    
        std::cout << zeilen.at(1).at(2) << '\n'; //Zweite Zeile drittes Zeichen
    }
    

    Edit²: Verdammt, das ist jetzt peinlich 😞



  • @Hacker: Wäre eine Lösung, jedoch musst du da die ganze Datei einlesen. Ist möglich aber glaube nicht im Sinne des Threadstellers.

    @BlackCubeX: Wenn du die Position IMMER kennst von der du Lesen möchtest, dann kannst du die Datei auch öffnen und den Dateizeiger auf diese Position setzen, hat den Nachteil das du auf C zurückgreifen müsstest(wenn mich nicht alles täuscht).
    Du hast jetzt also die Wahl:
    1. Entweder alles einlesen und danach parsen oder
    2. Mit C den Dateizeiger an die Position setzen wo du lesen willst.


  • Mod

    Firefighter schrieb:

    @BlackCubeX: Wenn du die Position IMMER kennst von der du Lesen möchtest, dann kannst du die Datei auch öffnen und den Dateizeiger auf diese Position setzen, hat den Nachteil das du auf C zurückgreifen müsstest(wenn mich nicht alles täuscht).

    Nenn mir eine Sache die FILE* kann, aber fstream nicht.

    Du hast jetzt also die Wahl:
    1. Entweder alles einlesen und danach parsen oder
    2. Mit C den Dateizeiger an die Position setzen wo du lesen willst.

    Das Problem ist doch eher, wie man die Position bekommt. Falls die Zeilen nicht alle gleich lang sind, so ist es nicht möglich, die Position zu berechnen und man muss alles einlesen. Wenn man genau weiß, das wievielte Zeichen man möchte, dann ist es hingegen einfach, genau dieses Zeichen zu lesen (egal mit welcher Standardbibliothek).



  • SeppJ schrieb:

    Nenn mir eine Sache die FILE* kann, aber fstream nicht.

    Ok, ich war mir nicht mehr bewusst das ich mit dem fstream genauso den Dateizeiger verschieben kann. Manchmal da hab ich das Gefühl das gewisse User hier nur drauf warten das jemand anderes was falsches schreibt um ihm dann ins Gesicht zu springen.

    Aber egal, mit deiner restlichen Ausführung hast du natürlich Recht.



  • SeppJ schrieb:

    Nenn mir eine Sache die FILE* kann, aber fstream nicht.

    popen? fdopen?



  • Na ja, Zeilen ignorieren geht doch wunderbar. stream.ignore(std::numeric_limitsstd::streamsize::max(), '\n'); Vier mal aufrufen und du bist bei der 5. Zeile angelangt.

    filefan schrieb:

    popen? fdopen?

    Nicht im Standard. Und es sind auch keine Manipulationen auf FILE*.



  • cooky451 schrieb:

    filefan schrieb:

    popen? fdopen?

    Nicht im Standard. Und es sind auch keine Manipulationen auf FILE*.

    Im Posix-Standard sind die drin. Und wenn fputs() keine Operation auf FILE* ist, dann ist seekg auch keine Operation auf fstream. Und um den ging es ja.


  • Mod

    filefan schrieb:

    cooky451 schrieb:

    filefan schrieb:

    popen? fdopen?

    Nicht im Standard. Und es sind auch keine Manipulationen auf FILE*.

    Im Posix-Standard sind die drin.

    Und? Der POSIX-Standard ist quasi eine C-Bibliothek. Du sagst also bloß, dass es Bibliotheken für C gibt. Die Standard fstreams und die C-Dateizeiger können vom technischen Standpunkt her beide genau das gleiche machen (was ein Zufall 🙄 ), benutzen sich bloß anders. Wenn du Fremdbibliotheken einbringst, kannst du auch für C++ Fremdbibliotheken einbringen, die dann auch können, was popen und fdopen machen.



  • SeppJ schrieb:

    Nenn mir eine Sache die FILE* kann, aber fstream nicht.

    So richtig schön schnell sein 😉



  • Firefighter schrieb:

    Manchmal da hab ich das Gefühl das gewisse User hier nur drauf warten das jemand anderes was falsches schreibt um ihm dann ins Gesicht zu springen.

    Kommt dir nicht nur so vor, ist so. Das machen sie bei mir dauernd. 🙄



  • hustbaer schrieb:

    SeppJ schrieb:

    Nenn mir eine Sache die FILE* kann, aber fstream nicht.

    So richtig schön schnell sein 😉

    Was ist eigentlich an FILE* so schnell? Kann das irgendwie effizienter binärdaten aus einer Datei lesen?



  • Das Problem ist eher, dass die iostreams langsam sind.
    (Langsamer als nötig)



  • Jetzt hast du die Frage auch nicht beantwortet.
    Geht es da um sowas http://pisa.ucsd.edu/cse125/2006/Papers/High_Performance_Game_Programming_in_C++.pdf (Seite 29)
    Sind solche Vergleiche nicht ziemlich nutzlos, wenn man immer wieder gecachte Daten liest? Selbst bei SSD Platten dürfte doch das wirkliche lesen neuer Daten viel mehr Zeit brauchen, als ein paar Verwaltungsoperationen.


Anmelden zum Antworten