istream und zeilennummern



  • Wie kann man, wenn man eine *.db Datei hat nur eine bestimmte Zeile einlesen lassen. Damit meine ich ob es eine Funktion gibt der ich sagen kann welche Zeile eingelesen werden soll, oder ob ich sie selber schreiben muss und wenn ja, könnt ihr mir sagen wie so etwas ungefähr aussieht?



  • Angenommen eine Datei hat n Zeilen, die erste Zeile ist die "nullte", du möchtest zur m-ten Zeilen springen. Das würde bedeuten dass du Zeichen einliest bis du m Zeilenumbrüche eingelesen hast.
    Das ist recht aufwändig aber nicht anders lösbar.



  • Das heißt ich muss m Zeilen einlesen und kann mir dann meine gesuchte Zeile heraussuchen?
    Und gibt es eine Funktion die mir n gibt?



  • Storm13000 schrieb:

    Das heißt ich muss m Zeilen einlesen und kann mir dann meine gesuchte Zeile heraussuchen?
    Und gibt es eine Funktion die mir n gibt?

    Joa, oder anders gesagt, du liest m Zeilen ein und verwirst sie, und die m+1 Zeile ist die die du haben willst.



  • Nein.

    Edit: Es gibt keine Funktion, die Dir n(die Anzahl der in der Datei vorhandenen Zeilen) gibt.

    Unter der Bedingung, dass alle Zeilen gleich lang sind (gleich viele Zeichen haben), kann man auch berechnen, wo die nte Zeile beginnt, und diese direkt einlesen, aber eben nur dann.



  • Storm13000 schrieb:

    Das heißt ich muss m Zeilen einlesen und kann mir dann meine gesuchte Zeile heraussuchen?
    Und gibt es eine Funktion die mir n gibt?

    Angenommen du willst die Zehnte Zeile in einem String speichern, und die erste Zeile habe den Index 0. Dann musst du Zeichen aus dem Stream extrahieren bis Zehn mal ein Zeilenumbruch (Escape-Sequenz '\n' ) vorkam:

    /// Du musst <limits> einbinden, und einen std::ifstream namens stream definieren
    
    int ct = 10;
    while( stream && ct--  )
        stream.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    
    if( ct == 0 ) // Erfolgreich gelesen
        // Mach was, lies weiter ein o. ä.
    else
        // Fehlerbehandlung - Datei zu kurz(?)
    


  • Das ist leider nicht der Fall.

    Dankeschön!



  • und verwirst sie

    Meintest du "verwirfst"? Sonst wäre das eine ziemlich merkwürdige Personifikation der Zeilen 😃



  • Sone schrieb:

    und verwirst sie

    Meintest du "verwirfst"? Sonst wäre das eine ziemlich merkwürdige Personifikation der Zeilen 😃

    Ja, meinte, verwirfst . 😃



  • Storm13000 schrieb:

    Das ist leider nicht der Fall.

    Sondern, was willst du genau erreichen?



  • out schrieb:

    Storm13000 schrieb:

    Das ist leider nicht der Fall.

    Sondern, was willst du genau erreichen?

    Wahrscheinlich verneinte er nur Bellis Aussage wegen der gleich langen Zeilen.



  • Hab einen Moment gebraucht, bin aber zu demselben Schluss gekommen.



  • Belli schrieb:

    Hab einen Moment gebraucht, bin aber zu demselben Schluss gekommen.

    😕 wovon redest du?
    (Ich meinte mit meinem Beitrag oben, dass er verneint hat dass seine Datei gleich lange Zeilen hat)



  • Falls du öfters auf Zeilen zugreifen musst, solltest du sie am Besten alle einlesen:

    #include <fstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    int main()
    {
    
        vector<string> lines;
        {
            string cur;
            ifstream file("file.txt");
            while(getline(file, cur))
                lines.push_back(move(cur));
        }    
    
        string line12 = lines.at(12);
    }
    


  • Sone schrieb:

    (Ich meinte mit meinem Beitrag oben, dass er verneint hat dass seine Datei gleich lange Zeilen hat)

    Ich bin zu demselben Schluss gekommen, aber erst nach einem Moment der Verunsicherung, weil Dein Posting zwischen meins und sein gerutscht ist.



  • out schrieb:

    Storm13000 schrieb:

    Das ist leider nicht der Fall.

    Sondern, was willst du genau erreichen?

    Damit habe ich mich auf die Frage ob alle Zeilen gleichlang sind bezogen.



  • Ich werde

    #include <fstream> 
    #include <string> 
    #include <vector> 
    
    using namespace std; 
    int main() 
    { 
    
        vector<string> lines; 
        { 
            string cur; 
            ifstream file("file.txt"); 
            while(getline(file, cur)) 
                lines.push_back(move(cur)); 
        }     
    
        string line12 = lines.at(12); 
    }
    

    mal ausprobieren, da ich alle Zeilen benötige, aber immer nur auf einige zugreifen muss.

    Vielen Dank!


Anmelden zum Antworten