"manuelles" Einlesen einer Datei "automatisieren"



  • Ich habe eine Text-Datei mit folgendem (zeilenweisen) Aufbau gegeben:

    Zeile1: int0
    Zeile2: int1
    Zeile3: a0 b0 c0 d0
    Zeile4: a1 b1 c1 d1
    Zeile5: a2 b2 c2 d2

    für dieses kurze Beispiel hab ich einfach jede Integer manuell in eine Variable eingelesen (mittels fopen, fscanf), jetzt wollt ich das für eine beliebig lange Liste "automatisieren". Also für:

    int0
    int1
    a_0 b_0 c_0 d_0
    a_1 b_1 c_1 d_1
    a_2 b_2 c_2 d_2
    ... ... ... ...
    a_n b_n c_n d_n

    und meine bisherigen for-Schleifen-Versuche sind alle gescheitert.
    Bräuchte mal einen Tipp wie ich da rangehen sollte (evtl ist mein Problem bei meinen Versuchen gewesen, dass erst ab der 3. Zeile die Schleife starten soll)

    Ab der 3. Zeile beschreiben die 4 Werte in einer Zeile jeweils einen Datensatz und sollten miteinander verquickt sein/bleiben.

    bin mir da nicht sicher, ob fscanf überhaupt der richtige bzw ein sinnvoller Ansatz ist...

    Danke schonmal für eure Hilfe 🙂

    //Dateiinhalt einlesen
        FILE *file;
        int knotenanzahl, kantenanzahl, u1, u2, u3, u4, u5, v1, v2, v3, v4, v5, c1, c2, c3, c4, c5, r1, r2, r3, r4, r5;
    
        file = fopen("Test.txt","r");
    
        fscanf(file,"%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", &knotenanzahl, &kantenanzahl, &u1, &u2, &u3, &u4, &u5, &v1, &v2, &v3, &v4, &v5, &c1, &c2, &c3, &c4, &c5, &r1, &r2, &r3, &r4, &r5);
    


  • A. Wo ist denn dein Code?
    B. Bist du im falschen Forum, weil dies hier ist das C++ Forum und nicht C. In C++ verwendet man die STL und nicht die C-Libs.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • pulper schrieb:

    bin mir da nicht sicher, ob fscanf überhaupt der richtige bzw ein sinnvoller Ansatz ist...

    Die scanf-Familie ist bisweilen ein wenig bockig. Eine andere Möglichkeit ist es, zeilenweise einzulesen und dann man: strtok zu verwenden.



  • Man kann auch zeilenweise einlesen und dann sscanf benutzen.



  • Für Codevereinfachung wäre es gut zu wissen:
    - liegen immer genau 4 Werte pro datenzeile vor
    - sind sie immer durch (1 oder mehrere) Leerzeichen getrennt
    - gibt es leere Spalten
    - sind die Werte vom gleichen zu interpretierenden Typ (Integer,String,...)

    Dann wären es wenige Zeilen.



  • Wutz schrieb:

    Für Codevereinfachung wäre es gut zu wissen:
    - liegen immer genau 4 Werte pro datenzeile vor
    - sind sie immer durch (1 oder mehrere) Leerzeichen getrennt
    - gibt es leere Spalten
    - sind die Werte vom gleichen zu interpretierenden Typ (Integer,String,...)

    Dann wären es wenige Zeilen.

    1. in den ersten beiden Zeilen steht jeweils nur EINE Zahl, in allen folgenden IMMER GENAU 4 ZAHLEN
    2. Trennungszeichen ist EIN LEERZEICHEN
    3. die Werte scheinen alle größere oder gleich Null zu sein (soweit ich die Daten bisher überflogen habe)
    4. sind alles Zahlen (Integer)

    mein manuelles Einlesen hab ich bei meinem 1. Posting editiert - habs hier im c++ Forum geposted, weil ich eigentlich in c++ programmieren wollte (jetzt versteh ich auch, warum ich die Befehle nicht im "Prinz & Prinz" finde 😕 )



  • pulper schrieb:

    mein manuelles Einlesen hab ich bei meinem 1. Posting editiert - habs hier im c++ Forum geposted, weil ich eigentlich in c++ programmieren wollte (jetzt versteh ich auch, warum ich die Befehle nicht im "Prinz & Prinz" finde 😕 )

    Jetzt eine wichtige Frage: Du programmierst C++? Wenn ja willst du nicht doch wieder ins C++ Froum und das Problem mit http://www.cplusplus.com/reference/iostream/ifstream/ lösen? Weil so wie du es machen willst programmierst du in C. C++ war das sicher nicht.



  • Wenn du C++ programmieren willst, dann ist es eigentlich ganz einfach.

    #include <fstream>
    #include <vector>
    
    struct Item
    {
        int a, b, c, d;
    	Item(int a_, int b_, int c_, int d_): a(a_), b(b_), c(c_), d(d_) {}
    };
    
    int main()
    {
        std::ifstream myfile("dateiname");
    	if (!myfile.is_open())
    		return 1;
    
    	int firstline;
    	myfile >> firstline;
    	int secondline;
    	myfile >> secondline;
    
    	std::vector<Item> mylist;
    	while ((myfile >> tmp0) && (myfile >> tmp1) && (myfile >> tmp2) && (myfile >> tmp3))
    		mylist.push_back(Item(tmp0, tmp1, tmp2, tmp3));
    
    	return 0;
    }
    

    nicht getestet

    Die Reihen stehen dann zum Schluss alle im vector. Diese Vorgehensweise setzt aber voraus, dass wirklich in jeder Zeile genau 4 Integer stehen und nichts anderes.

    So sollte es auch gehen:

    ...
    	int firstline, secondline;
    	myfile >> firstline >> secondline;
    
    	std::vector<Item> mylist;
    	while (myfile >> tmp0 >> tmp1 >> tmp2 >> tmp3)
    		mylist.push_back(Item(tmp0, tmp1, tmp2, tmp3));
    ...
    


  • Das eigentliche Lesen sind nur die inneren 6 Zeilen.
    Zu erwähnen wäre noch, dass hierbei "unpassende" Datenzeilen automatisch ignoriert werden, z.B. stören die ersten beiden Zeilen nicht.

    #define MAXZEILE 1000
    int main()
    {
      char zeile[MAXZEILE];
      int (*matrix)[4]=0, num=0, x;
      FILE *f = fopen("test.txt","rt");
      while( fgets(zeile,MAXZEILE,f) )
        if( 4==sscanf(zeile,"%d%d%d%d",&x,&x,&x,&x) )
        {
          matrix=realloc(matrix,++num*sizeof*matrix);
          sscanf(zeile,"%d%d%d%d",&matrix[num-1][0],&matrix[num-1][1],&matrix[num-1][2],&matrix[num-1][3]);
        }
      fclose(f);
      for(x=0;x<num;++x)
        printf("\n%d %d %d %d",matrix[x][0],matrix[x][1],matrix[x][2],matrix[x][3]);
      free(matrix);  
      return 0;
    }
    


  • danke schonmal für eure Anregungen - ich schaus mir gleich an - werde mir gleich mal im "Prinz & Prinz" das Kaiptel über File-Stream-Klassen durchlesen und mir eure Beispiele anschauen...

    son Mischmasch kommt halt raus, wenn man Buch, Internet & Google zu früh verquickt und meint, dass die Unterschiede zwischen C und C++ nicht so gravierend sein können... 😕

    Falls ich mit "C++" während des Projekts noch weitere Probleme bekommen sollte, melde ich mich wieder, hier wird einem ja sau schnell geholfen 😉

    also wohl bis später irgendwann & Danke nochmal,
    Pulper 🙂


Anmelden zum Antworten