TXT in Array speichern mit Leerzeichen



  • Hi

    Ich habe schon das ganze Internet durchsucht aber so richtig nichts gefunden oder ich habe es nicht verstanden.

    Ich möchte ein Programm schreiben was am Anfang eine .txt Datei einliest und deren Inhalt dann in ein zweidimensionales Array speichert. Das bekomme ich bis jetzt auch super hin das Problem ist nur das die Leerzeichen nicht mit übertragen werden. Diese brauche ich aber ganz dringend da ich die einzelnen Zahlen aus der .txt Datei auswerten muss.
    Die .txt Datei sieht zum Beispiel so aus:

    1 23 45 38 24
    78 12 2 123
    98
    234 564 12 5
    4 6743 23

    Mein Problem bei der suche mit google war das ich nichts von dem verstanden habe was dort an Hilfe angeboten wurde. Hoffe hier kann mir jemand dieses Problem für DAUs erklären 🙂



  • #include <deque>
    #include <fstream>
    #include <string>
    
    int main() {
      std::ifstream in("some_file.txt");
      std::deque<std::string> lines;
      std::string line;
    
      while(getline(in, line)) {
        lines.push_back(line);
      }
    
      // Datei liegt jetzt zeilenweise in lines
    }
    

    ?


  • Mod

    Was denn nun? Zahlen verarbeiten? Warum sind dann Leerzeichen wichtig? Wie soll die Datenstruktur am Ende aussehen?

    Die Zeilen scheinen hier unterschiedlich lang zu sein, statt 2D-Array meinst du wohl eher etwas wie vector<vector>, oder?



  • seldon schrieb:

    ...
    

    ?

    nein. 👎
    wozu erst in strings packen wenn zahlen ins array sollen? 😕



  • Weil es das ist, wonach er gefragt hat. Womöglich braucht er ja nachher nicht nur die Zahlen, sondern auch den ursprünglichen Text (zur Anzeige bspw.).

    Im Übrigen wird man nicht umhinkommen, die Zeilen einzeln einzulesen und zu verarbeiten, da sie nicht alle gleich lang sind. Ob sie dauerhaft gespeichert werden müssen, muss der TE selbst wissen (nicht du).

    Abschließend: 👎



  • Es wurde schon mal richtig erkannt das die Zeilen nicht alle gleich lang sind.
    Ich brauch ganz dringend die Leerzeichen da die Stelle der Zahl für mich wichtig ist. Die erste zahl ist eine x Koordinate die zweite eine y Koordinate und so weiter.
    Dann ist es auch noch wichtig in welcher Zeile die Zahl steht.

    Ich brauch den Quelltext oder die Hilfe übrigens in C++



  • MaxF92 schrieb:

    [...]Ich brauch ganz dringend die Leerzeichen da die Stelle der Zahl für mich wichtig ist. Die erste zahl ist eine x Koordinate die zweite eine y Koordinate und so weiter.
    Dann ist es auch noch wichtig in welcher Zeile die Zahl steht.
    [...]

    Das leuchtet mir irgendwie nicht ein, für Dein Beispiel der txt-Datei:

    MaxF92 schrieb:

    1 23 45 38 24
    78 12 2 123
    98
    234 564 12 5
    4 6743 23
    

    Das heisst dann also, die erste Zeile hat zum dritten x-Wert kein y-Wert? Oder die dritte Zeile hat nur einen x-Wert? Irgendwie ist nicht wirklich klar, was Du da treibst.



  • MaxF92 schrieb:

    Es wurde schon mal richtig erkannt das die Zeilen nicht alle gleich lang sind.
    Ich brauch ganz dringend die Leerzeichen da die Stelle der Zahl für mich wichtig ist. Die erste zahl ist eine x Koordinate die zweite eine y Koordinate und so weiter.
    Dann ist es auch noch wichtig in welcher Zeile die Zahl steht.

    Ich brauch den Quelltext oder die Hilfe übrigens in C++

    Und was gefällt dir an seldons Lösung nicht?



  • seldon schrieb:

    #include <deque>
    #include <fstream>
    #include <string>
    
    int main() {
      std::ifstream in("some_file.txt");
      std::deque<std::string> lines;
      std::string line;
    
      while(getline(in, line)) {
        lines.push_back(line);
      }
    
      // Datei liegt jetzt zeilenweise in lines
    }
    

    ?

    Das Array heißt hier in dem Beispiel lines oder?



  • Mein Programm sah bis jetzt so aus

    #include <fstream>
    #include <iostream>
    using namespace std;

    char array[200];
    ifstream datei;

    datei.open("test.txt");
    for (int i=0;i<199;i++){
    datei>>array[i];
    }

    das hat auch super funktioniert nur das eben die leerzeichen nicht eingelesen werden

    Hier werden zwar die zeilen ignoriert aber das ist im notfall nciht so schlimm hauptsache ich hab die leerzeilen mit drin


  • Mod

    MaxF92 schrieb:

    Das Array heißt hier in dem Beispiel lines oder?

    lines ist hier eine Liste von Zeilen aus chars. Arrays benutzt man in C++ äußerst selten. deque und string sind komplexere Datenstrukuren, wobei ein string so etwas ähnliches wie ein char-Array mit beliebig änderbarer Größe ist und eine deque ist ebenfalls so etwas wie ein Array mit anpassbarer Größe (wobei ich hier eher vector genommen hätte, was auch in diese Kategorie fällt, aber für ein bisschen weniger Flexibilität viel schneller ist).

    Die Lösung von seldon ist die direkte und korrekte Antwort auf deine Frage, wie du die Datei inklusive Leerzeichen in einer Datenstruktor speichern kannst. Deine Beschreibung, was du mit den Daten vor hast, passt jedoch überhaupt nicht zu dieser Frage, denn wenn du die Zahlen haben möchtest, wozu dann die Leerzeichen? Siehe Tachyons Beitrag.

    Das Problem ist hier wohl, dass du anscheinend so gut wie gar kein C++ kannst und gar nicht weißt, wie die Basisdatenstrukturen der Standardbibliothek aussehen oder wie man Eingaben verarbeitet, oder? Dadurch verstehst du die Antworten nicht. Kommst du von C?



  • Ich hab zuvor nur mit java programmiert.


  • Mod

    MaxF92 schrieb:

    Mein Programm sah bis jetzt so aus

    #include <fstream>
    #include <iostream>
    using namespace std;

    char array[200];
    ifstream datei;

    datei.open("test.txt");
    for (int i=0;i<199;i++){
    datei>>array[i];
    }

    das hat auch super funktioniert nur das eben die leerzeichen nicht eingelesen werden

    Hier werden zwar die zeilen ignoriert aber das ist im notfall nciht so schlimm hauptsache ich hab die leerzeilen mit drin

    Da dran ist ja gar nix 2D. Die Leerzeichen kommen hier nicht mit, da operator>> standardmäßig Whitespace ignoriert. Das ganze kannst du aber auch wesentlich einfacher haben, mit einem read:
    http://www.cplusplus.com/reference/iostream/istream/read/
    Dann wird dein Programm zu:

    #include <fstream>
    using namespace std;
    
    int main()
    {
     char array[200];
     ifstream datei("test.txt");
     datei.read(array, 200);  
    }
    

    Jedoch Problem: Wozu ist das gut? Jetzt steckt der Inhalt der Datei zeichenweise in array. Wie weiterverarbeiten? Darum sind in diesem Thread alle so verwirrt. Wenn du jetzt irgendwelche tollen Parseoperationen auf das Array anwendest, hättest du diese doch gleich auf die Datei anwenden können. So macht man das jedenfalls üblicherweise.


  • Mod

    MaxF92 schrieb:

    Ich hab zuvor nur mit java programmiert.

    Na, dann besorg dir mal ein richtiges C++-Buch, ohne Arrays (oder zumindest nicht mit Arrays als hauptsächlich benutzte Datenstruktur - vorkommen sollten sie schon), dafür mit den Datenstrukturen der Standardbibliothek. Du lernst doch hoffentlich nicht mit Internettutorials oder Büchern von Jürgen Wolf? Die kann man von der Qualität her nämlich total vergessen.

    Wenn du von Java kommst, sollte das meiste an seldons Programm doch erkennbar sein: deque ist so etwas wie die Deque in Java, string ist so etwas wie String und der von mir vorgeschlagene vector so etwas wie Vector. Wie du siehst, ist die Übersetzung der Datenstrukturen nicht schwer 😃 .



  • SeppJ schrieb:

    MaxF92 schrieb:

    Mein Programm sah bis jetzt so aus

    #include <fstream>
    #include <iostream>
    using namespace std;

    char array[200];
    ifstream datei;

    datei.open("test.txt");
    for (int i=0;i<199;i++){
    datei>>array[i];
    }

    das hat auch super funktioniert nur das eben die leerzeichen nicht eingelesen werden

    Hier werden zwar die zeilen ignoriert aber das ist im notfall nciht so schlimm hauptsache ich hab die leerzeilen mit drin

    Da dran ist ja gar nix 2D. Die Leerzeichen kommen hier nicht mit, da operator>> standardmäßig Whitespace ignoriert. Das ganze kannst du aber auch wesentlich einfacher haben, mit einem read:
    http://www.cplusplus.com/reference/iostream/istream/read/
    Dann wird dein Programm zu:

    #include <fstream>
    using namespace std;
    
    int main()
    {
     char array[200];
     ifstream datei("test.txt");
     datei.read(array, 200);  
    }
    

    Jedoch Problem: Wozu ist das gut? Jetzt steckt der Inhalt der Datei zeichenweise in array. Wie weiterverarbeiten? Darum sind in diesem Thread alle so verwirrt. Wenn du jetzt irgendwelche tollen Parseoperationen auf das Array anwendest, hättest du diese doch gleich auf die Datei anwenden können. So macht man das jedenfalls üblicherweise.

    Ich weiß das das jetzt nicht 2d ist hab ich aber auch schon drüber geschrieben. Hab das jetzt umgesetzt und das Problem bleibt das er keine Leerzeichen einlesen kann.



  • leerzeichen brauchste nicht, du kannst die anzahl der eingelesenen zahlen zählen.

    #include <iostream> 
    #include <fstream> 
    using namespace std;
    
    void save_number ( int number, int n ) 
    {
    	cout << "Save number " << number << " from line " << n << endl; 
    }
    
    int main(void) 
    {
        fstream f("test.txt");
    	int num, n=0;
    	char c;
    	while(!f.eof()) {
    
    		f.get(c);
    
    		if ( c == '\n' )
    		{	
    			cout << "Bis hier Zeile " << ++n << endl;
    		}
    		else
    		{
    			f.unget();
    		}
    
    		f >> num;
    		if (f.good())
    		{
    			save_number ( num, n + 1 );
    		}
    		else
    		{
    			f.clear();
    			f.ignore();
    		}
    	}
    	getchar();
    return 0;	
    }
    


  • Würdest Du bitte die Güte haben und klar und deutlich beschreiben, was gegeben ist und was du erreichen willst?
    Was bedeutet die erste Zahl der Zeile, wenn eine Zahl in der Zeile alleine Steht? Was bedeutet die erste, was die zweite Zahl, wenn zwei Zahlen in einer Zeile stehen? Was bedeutet die erste, die zweite, was die dritte Zahl, wenn drei Zahlen in einer Zeile stehen? Was bedeutet die erste, die zweite, die dritte, was die vierte Zahl, wenn vier Zahlen in einer Zeile stehen? Was bedeutet die erste, die zweite, die dritte, die vierte, was die fünfte Zahl, wenn fünf Zahlen in einer Zeile stehen? Was bedeutet die erste, die zweite, die dritte, die vierte, die fünfte, was die sechste Zahl, wenn sechs Zahlen in einer Zeile stehen? Was bedeutet die Zeilennummer für die Werte in einer Zeile?
    Was willst Du mit den Werten wenn Du sie ersteinmal hast anstellen?



  • Es kann durhaus sein das ich vielleicht unkonventionell programmiere aber ich hätte gern das die txt Datei die So aussieht:

    1 23 45 38 24
    78 12 2 123
    98
    234 564 12 5
    4 6743 23

    danach in einem array ist und so aussieht:

    array[1;" ";2;3;" ";4;5;" ";...]

    Es kann sein das das vllt sinnlos aussieht aber ich brauche es so da ich es so am besten verarbeiten kann.



  • Würdest Du bitte Fragen beantworten!?



  • MaxF92 schrieb:

    so da ich es so am besten verarbeiten kann.

    Da bleibt die frage WARUM? 😉 Das wollen sie hören. 😉



  • die erste zahl ist eine koordinate genauso wie alle in der ersten zeile
    die zweite zeile enthält auch koordinaten aber für ein anderes objekt
    dritte zeile ist eine anzahl
    die ganzen nächsten zeilen sind wieder koordinaten

    was ich haben will:
    das oben beschriebene array so das ich es dann in ruhe auslesen kann und dann in variablen wie sizex die erste zahl reinschreiben kann und so weiter. das restliche programm ist schon so gut wie fertig


Anmelden zum Antworten