Von Textdatei in zweidimensionales Array schreiben



  • Hi Leute!

    Ich hab folgenden Code geschrieben. Der funktioniert auch soweit. Ich möchte aber nun, dass ich innerhalb der while-Schleife nicht einfach auf die Konsole ausgebe, sondern, in ein zweidimensionales Array schreibe.

    #include <iostream>                    
    #include <string>
    #include <fstream>
    using namespace std;
    
    int main()                             
    {   
    	string dateiname;
    	ifstream datei;
    	char eingelesen[100];
    
    	cout << endl;
    	cout << "Name der zu oeffnenden Datei: ";
    	cin >> dateiname;
    	cout << endl;
    
    	// Datei zum Schreiben öffnen
    	datei.open(dateiname.c_str(), ios_base::in);
    
    	// Überschrift einlesen und auf Konsole ausgeben
    	while (!datei.eof())
    	{
    		datei.getline(eingelesen, 100);
    		cout << eingelesen;
    	}
    
    	cout << endl;
    	cout << "Daten wurden eingelesen " << endl;
    
    	// Datei schließen
    	datei.close();
    
    	cout << endl << endl;
    
    return 0;                           
    }
    

    Wie mache ich das am besten? Ich bräuchte quasi sowas in der Art wenn es das geben würde:

    text[i][j] = datei.getline(eingelesen, 100);
    

    Ich weiß natürlich, dass es sowas so nicht gibt, aber deshalb hab ich nachgefragt.

    Kann mir jemand helfen?



  • Warum liest Du in ein char-Array ein?
    Warum willst Du in ein zweidimensionales Array einlesen?

    Kannst Du nicht
    in einen string statt in ein char-Array einlesen und
    in einen vector<string> statt in ein zweidimensionales Array?



  • Also mal ganz langsam. Du hast in der Textdatei einfach eine Matrix, oder was?
    Dann sieht der Code zum Einlesen in bspw. einen Vektor so aus:

    std::ifstream is("Text.txt");
    std::vector<int> vec( std::istream_iterator<int>(is), std::istream_iterator<int>() );
    

    Wenn du anschließend die breite kennst, kannst du damit dann den eindimensionalen irgendwie aufteilen, oder Wrappen, usw.

    (Ungetestet! 😃 )



  • Belli schrieb:

    Warum liest Du in ein char-Array ein?
    Warum willst Du in ein zweidimensionales Array einlesen?

    Kannst Du nicht
    in einen string statt in ein char-Array einlesen und
    in einen vector<string> statt in ein zweidimensionales Array?

    Wieso schreibt ihr alle in Gedicht-Form? Mit so schönen Enjambements... 👍



  • Sone schrieb:

    std::vector<int> vec( std::istream_iterator<int>(is),std::istream_iterator<int>() );
    

    Funktionsdeklaration



  • Ja, der Fehler nervt.
    Wieso eigentlich?



  • vip@r, du machst einige Dinge nicht richtig. Arbeitest du gerade zum ersten Mal mit fstream?

    vip@r schrieb:

    ifstream datei;
    

    Du hast vergessen, den Namen der Datei anzugeben. Das i in ifstream steht für input. 💡 Die Angabe von ios_base::in ist natürlich unnötig. Willst du einen Dateinamen einlesen, musst du dies natürlich vor dieser Anweisung tun. Ansonsten noch ganz wichtig: RAII --> Wikipedia

    vip@r schrieb:

    while (!datei.eof())
    

    Ohohoh, ganz, ganz fataler Fehler. Du ließt falsch. Du machst folgendes:
    1. Prüfen
    2. Lesen
    3. Verarbeiten
    Das ist natürlich Murx ⚠.

    Du musst es natürlich so machen 💡:
    1. Lesen
    2. Prüfen
    3. Verarbeiten, falls erfolgreich gelesen.

    vip@r schrieb:

    datei.close();
    

    Wie gesagt... RAII

    vip@r schrieb:

    Wie mache ich das am besten?

    std::vector + std::string. Falls du diese Container nicht kennst, schau sie dir an. Sie sind wichtig.



  • Nathan schrieb:

    Ja, der Fehler nervt.
    Wieso eigentlich?

    Du weißt ja, dass du Parameternamen weglassen darfst, nicht nur bei einer Funktionsdeklaration, auch bei einer Funktionsdefinition. Jetzt ist nur noch wichtig zu wissen, dass

    int zahl;
    int(zahl);
    int (zahl);
    

    alles dasselbe ist. So, und wenn du so eine Zeile nun primitiv ersetzt, dann siehst du auch sofort, dass es eine Funktionsdeklaration ist.

    std::vector<int> vec( std::istream_iterator<int>(is), std::istream_iterator<int>() );
    int vec(int (zahl),int);
    


  • Sorry, eben ungetestet. 😃
    Entweder einfach doppelt umklammern, oder seit C++11 (bzw. schon seit C++0x) einfach mit Listen-initialisierung.



  • Oh, ach so.
    Trotzdem blöd.



  • Nathan schrieb:

    Oh, ach so.
    Trotzdem blöd.

    Willkommen bei C++. Möchten sie einen Drink?

    Neh, aber mal ernst.

    Wo zum Teufel braucht man lokal deklarierte Funktionen? Die Komplikationen die durch dieses "Feature" entstehen, werden durch den Vorteil (welcher auch immer dieser sein mag) definitiv nicht kompensiert. 👎



  • @out: Ja, ich arbeite heute das erste mal mit diesem ifstream.

    1. Lesen
    2. Prüfen
    3. Verarbeiten, falls erfolgreich gelesen.

    Wie würde das dann bei mir aussehen?

    Ich bekomme aber keine Zahlen sondern strings. Ich hab hier eine Textdatei mit einem Maschinenregisterprogramm das mir mein C++ Programm irgendwann mal interpretieren soll.

    Dazu will ich eben aus einem txt-File ein paar Zeilen einlesen, die durch ";" abgetrennt sind. Und da wäre mir eben spontan ein Array eingefallen das in jeder Zeile eine Anweisung stehen hat. Versteht ihr?



  • vip@r schrieb:

    @out: Ja, ich arbeite heute das erste mal mit diesem ifstream.

    1. Lesen
    2. Prüfen
    3. Verarbeiten, falls erfolgreich gelesen.

    Wie würde das dann bei mir aussehen?

    Dazu muss ich den Aufbau deiner Datei wisse, und was du genau lesen willst.



  • Also, du willst Zahlen einlesen, die durch ein ; getrennt sind?

    std::vector<int> numbers;
    int i;
    char buf;
    while (file >> i >> std::ws >> buf)
        numbers.push_back(i);
    

Log in to reply