Integer aus txt auslesen und in Array speichern.



  • Hallo,

    Ich habe folgendes geplant:

    Ich habe eine txt Datei mit einer Menge Zahlen, dass ganze sieht in etwas so aus:

    1 3 8 4 5 6 7 8 9
    3 4 6 3 8 6 4 3 4
    2 4 5 7 3 2 4 5 1
    2 3 4 5 6 7 8 5 3

    usw.

    nun möchte ich die einzelnen Zahlen gerne aus der Textdatei auslesen und in einem Array speichern.

    Also:

    MeinArray|0]= 1
    MeinArray|1]= 3
    MeinArray|2]= 8
    MeinArray|3]= 4
    MeinArray|4]= 5

    usw.

    Mein Code bislang:

    int ZahlenTest;
    ifstream Input ("Data/Zahlen.txt", ios::binary);
    if (Input == NULL)
     {
       cout << "Datei konnte nicht gefunden werden" << endl;
     }else{
       Input.read ((char*) &ZahlenTest, sizeof(ZahlenTest));
       cout << ZahlenTest; 
     }
    Input.close();
    

    Wenn in der Datei nun nur eine 1 steht, zeigt er mir später ein ^ an... .

    Irgendwie komme ich nun nicht richtig weiter... . Ich gehe ma davon aus, dass das was ich einlese aus der Datei, ein String ist und kein Integer.

    Wie kann ich nun den eingelesenen String in ein Int Array umwandeln wobei er bei jedem "Leerzeichen" Trennt ?!

    Vielen Dank

    Gast1985


  • Administrator

    Was du machst, ist einfach die Bytes zu lesen und zu speichern. Anders gesagt, mit dieser Anweisung: Input.read ((char*) &ZahlenTest, sizeof(ZahlenTest)); , werden üblicherweise 4 Bytes gelesen. In einem ASCII kodiertem File 4 Zeichen. Bei deiner Formatierung, 2 Leerzeichen und 2 Zahlen. Also sicher nicht was du willst 🙂

    Um Text einzulesen kannst du die Shiftoperatoren verwenden. Die sind da deutlich besser geeignet. Die überspringen auch Leerzeichen automatisch, was einem einen sehr einfachen Code erlaubt:

    int number;
    std::vector<int> vec;
    
    std::ifstream file("daten/zahlen.txt");
    
    while(file >> number)
    { vec.push_back(number); }
    

    Das ganze lässt sich sogar noch weiter vereinfachen:

    // Statt der while-Schleife, kannst du das folgende verwenden:
    std::copy(std::istream_iterator<int>(file), std::istream_iterator<int>(), std::back_inserter(vec));
    

    C++ Referenz: http://www.cplusplus.com/reference/

    Grüssli



  • danke, Dravere.. leider hast du uns nicht weiter gebracht.

    Ich hab das selbe problem und scheinbar will da keiner einem so richtig helfen oder es weiss keiner.

    Die Frage lautet: Wie liest man Integer Zahlen aus einer Datei und speichert diese in einem Array ab..

    mit getline, get() oder dergleichen funktuioniert es nicht. Es scheint auch als ob keine der gelisteten Operatoren in auf der cplusplus seite unter ifstream einem dabei weiter helfen.

    Hat jemand eine Ahnung? bitte mit konkretem beispiel in C++.. es wird vielen helfen.



  • McBean schrieb:

    [...]bitte mit konkretem beispiel[...]

    Hier ein Beispiel:

    //main.cpp
    #include <iostream>
    #include <fstream>
    
    int main()
    {
    	const unsigned int zeilen = 4;
    	const unsigned int spalten = 9;
    	int int_werte[zeilen][spalten];
    	std::ifstream input("daten.txt");
    	if(!input) {
    		std::cerr << "Die Datei wurde nicht gefunden." << std::endl;
    		return -1;
    	}
    	// Daten Einlesen
    	for(unsigned int x = 0; x != zeilen; ++x) {
    		for(unsigned int y = 0; y != spalten; ++y) {
    			if(!input.eof()) {
    				input >> int_werte[x][y];
    			} else {
    				int_werte[x][y] = 0;
    			}
    		}
    	}
    	input.close();
    	// Ausgabe
    	std::cout << "Die Datei enthielt die folgenden Integerwerte:" << std::endl;
    	for(unsigned int x = 0; x != zeilen; ++x) {
    		for(unsigned int y = 0; y != spalten; ++y) {
    			std::cout << int_werte[x][y] << " ";
    		}
    		std::cout << std::endl;
    	}
    
    	return 0;
    }
    

    Inhalt von "daten.txt":

    1 3 8 4 5 6 7 8 9
    3 4 6 3 8 6 4 3 4
    2 4 5 7 3 2 4 5 1
    2 3 4 5 6 7 8 5 3
    


  • #include <stdlib.h>
    #include <stdio.h>
    #define INITIAL_SIZE 10
    
    void resize_Array(int** Array,unsigned* arraySize){
     (*arraySize) <<= 1;
     (*Array) = (int*) realloc((*Array),(*arraySize)*sizeof(int));
    }
    
    int main(){
     unsigned counter = 0, arraySize = INITIAL_SIZE;
     int* Array = (int*) calloc(arraySize,sizeof(int));
     FILE* myFile = fopen("Filename.txt","r"); /* Setzt voraus, dass im Programmverzeichnis
    										   eine derartige Datei mit diesem Namen existiert */
     if(!myFile){
      printf("Datei nicht gefunden");
      return 0;
     }
     while(counter < arraySize){
      if(fscanf(myFile,"%d",(Array + counter)) != 1)
       break;
      else{
       ++counter;
       if(counter == arraySize)
    	resize_Array(&Array,&arraySize);
      }
     }
    
     printf("Folgende Werte konnten erfolgreich eingelesen werden: \n");
     for(unsigned i = 0; i < counter; ++i)
      printf("%d \n",Array[i]);
     fgetc(stdin); /* nur noetig, wenn Konsolenfenster automatisch geschlossen werden */
    
     return 0;
    }
    
    /* Nur rudimentaer getestet -> Das Programm tat dabei, was es sollte (zumindest auf
       meinem Rechner ...), d.h. alle Zahlen aus der Datei wurden gelesen.
     der Compiler (MS_VC++ 2008 Express) verweigert auch nicht die Uebersetzung. 
    Es duerfte deshalb vermutlich noch so halbwegs im Standard_Rahmen sein, auch wenn's 
    most obfuscated aussieht.
    */
    


  • McBean schrieb:

    Die Frage lautet: Wie liest man Integer Zahlen aus einer Datei und speichert diese in einem Array ab..

    Aber genau das macht Draveres Code doch. Hier mal der komplette Code, inklusive includes:

    #include <fstream>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	// Datei öffnen
    	ifstream file( "bla.txt" );
    	if ( ! file )
    		return 1;
    
    	// Alle Werte einlesen
    	vector<int> values;
    	copy( istream_iterator<int>(file), istream_iterator<int>(), back_inserter(values) );
    
    	// Ausgabe
    	cout << values.size() << " Werte ausgelesen:\n";
    	copy( values.begin(), values.end(), ostream_iterator<int>(cout," ") );
    	cout << endl;
    }
    

Anmelden zum Antworten