Zeilenweise aus Datei einlesen mit Hindernissen



  • Danke für die Antwort. Welche Header brauche ich denn für deine Befehle?

    Habe mir jetzt auch überlegt die Datei via fgets() auszulesen, leider mit nicht zufriedenstellendem Ergebnis:

    if (fi == NULL)
    	printf("\n no input file found, please check datenfile \n\n");
    
    while(fgets(zeile, ZEILENLAENGE, fi))
    	{
    	for(int i = 0; i<MAX1; i++)
    		input[i]=zeile[i];
    		printf("%s",input);
    	}
    printf("\n\n\n\n%s",input);
    

    Ich möchte jetzt jede Zeile in einen einzelnen Array speichern, leider funktioniert das nicht.



  • Ohnezu wissen wie Input und Zeile definiert sind, kann ich nicht sagen was input[i]=zeile[i]; tut.

    Ich habe die Vermutung, dass Du grundsätzlich mal ein Buch über C/C++ lesen musst um den Unterschied zwischen Zeigern und Arrays kennen zu lernen.



  • Wenn du mit CStdioFile arbeiten würdest, wäre das Vergleichen einfacher...
    Wenn du bei C bleiben willst, schiebe ich dich mal in das passende Forum.



  • Ich möchte bei C bleiben, könntest du dann den Thread verschieben?



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Mittlerweile hab ich folgendes:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX1 50
    #define ZEILENLAENGE 80
    
    void main()
    {
    
    int a,b,c,d,e,x,y,resultat;
    FILE*fi;
    char datenfile[]= "C:\\fahrzeugdatenfile.txt";
    char zeile[ZEILENLAENGE];
    char input[ZEILENLAENGE];
    char buffer[MAX1];
    fi = fopen(datenfile,"r");
    
    if (fi == NULL)
    	printf("\n no input file found, please check datenfile \n\n");
    
    while(!feof(fi))
    {
    	fgets(zeile, ZEILENLAENGE, fi); //while + for durch feof ersetzen
    	resultat = sscanf(zeile, "%s%f ", &input);
    	//printf("%s",input);
    	//printf("\n%s",zeile);
    	buffer == zeile;
    	//switch (zeile[0])
    	//	{
    	//	case '!': 
    	//	case '*': 
    	//	case '#': 
    	//	case '%': 
    	//	}
    
    	printf("\n\n\ zeile innerhalb for-Schleife= %s ",&input);
    
    }
    printf("\n\n\ buffer nach for-Schleife =  ",buffer);
    
    }
    

    was ich jetzt noch nicht hinbekomme ist das Speichern des Input Wertes in einen Array oder Vektor, den ich auch außerhalb der while -Schleife ansprechen kann. Zudem fehlen mir noch die Anweisungen für die switch-case Bedingungen, bei den oben genannten Bedingungen (switch Befehle) soll er jeweils eine Zeile überspringen.
    Danke für eure Hilfe!



  • Theresa schrieb:

    was ich jetzt noch nicht hinbekomme ist das Speichern des Input Wertes in einen Array oder Vektor, den ich auch außerhalb der while -Schleife ansprechen kann.

    Leg dir außerhalb der Schleife ein 2D-Array an und fülle es dann mit strcpy()-Aufrufen

    Zudem fehlen mir noch die Anweisungen für die switch-case Bedingungen, bei den oben genannten Bedingungen (switch Befehle) soll er jeweils eine Zeile überspringen.

    Du kannst die Bearbeitung direkt abbrechen und zurückspringen an den Schleifenanfang (continue)

    btw, die Anweisung "buffer==zeile;" ist Käse - du vergleichst erstens zwei Pointerwerte, die immer verschieden sind und zweitens machst du nichts mit dem Ergebnis des Vergleichs.



  • Vielen Dank für deine Hilfe. Mittlerweile bin ich soweit:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX1 50
    #define ZEILENLAENGE 80
    
    void main()
    {
    
    int resultat, i=0;
    FILE*fi;
    char datenfile[]= "C:\\fahrzeugdatenfile.txt";
    char zeile[ZEILENLAENGE];
    char input[ZEILENLAENGE], buffer[MAX1][MAX1],help[MAX1];
    fi = fopen(datenfile,"r");
    
    if (fi == NULL)
    	printf("\n no input file found, please check datenfile \n\n");
    
    while(!feof(fi))
    {
    	i++;
    	fgets(zeile, ZEILENLAENGE, fi); 
    	resultat = sscanf(zeile, "%s %lf ", &input);
    	switch (zeile[0])
    		{
    		case '!': fgets(zeile, ZEILENLAENGE, fi) == "\n"; i-=1; continue;
    		case '*': fgets(zeile, ZEILENLAENGE, fi) == "\n"; i-=1; continue;
    		case '#': fgets(zeile, ZEILENLAENGE, fi) == "\n"; i-=1; continue;
    		case '%': fgets(zeile, ZEILENLAENGE, fi) == "\n"; i-=1; continue;
    		case ' ': fgets(zeile, ZEILENLAENGE, fi) == "\n"; i-=1; continue;
    		}
    
    	strcpy(help, input);
    	printf("\n\n\ input innerhalb for-Schleife= %s i = %d",input, i);
    	printf("\n\n\ zeile innerhalb for-Schleife= %s ",zeile);
    	printf("\n\n\ help innerhalb for-Schleife= %s ",help);
    }
    printf("\n\n\ input nach for-Schleife =  ",input);
    printf("\n\n\ help nach for-Schleife= %s ",help);
    }
    

    Ich kann jetzt die Zeilen nach meinen Wünschen auslesen. Leider habe ich das mit dem 2d Array nicht verstanden, bzw. ich bekomme es einfach nicht hin innherhalb der while-Schleife mir meine DAten aus dem Einlesefile in einen Array zu speichern, den ich auch noch im Hauptprogramm ansprechen kann. Die Hilfsvariable i habe ich mir angelegt um nachher meine Daten entsprechend im Array ablegen zu können.

    Ach ja nochwas: Nach der try&error Methode bin ich bei der switch-case Anweisung vorgegangen, ist der entsprechende case = 1 möchte ich dem fgets Befehl mitteilen dass er in die nächste ZEile springen soll mit fgets(...) == "\n", das funktioniert auch nur bringt er mir eine Warnmeldung ob ich statt "==" nicht "=" meine, ersetze ich "==" durch "=" kommt eine Fehlermeldung.



  • Erstens kannst du dort im switch() das fgets() ganz weglassen - es sei denn, du willst die Zeile nach der mit '!' etc beginnenden überspringen. Das "continue" verlässt bereits den aktuellen Durchgang der while()-Schleife und verhindert so, daß die aktuelle Zeile weiterverarbeitet wird.

    Zweitens ist der Vergleich dort hirnrissig (aus den selben Gründen wie bei deinem letzten Versuch das "buffer==zeile;" sinnlos war).

    Drittens kannst du die switch()-Anweisung zusammenfassen zu einer if()-Abfrage:

    if(strchr("!*#% ",zeile[0]) != NULL) //Zeile beginnt mit Kommentarmarke
      continue;
    

    Und viertens zum Thema Array:

    char buffer[MAXL][ZEILENLAENGE];
    int bufind=0;
    while(!feof(fI)
    {
      fgets(zeile,ZEILENLAENGE,fi);
      ...
      strcpy(buffer[bufind],zeile);
      ++bufind;
    }
    

    (natürlich könnte man das Array auch dynamisch per malloc bereitstellen)



  • Super!

    Vielen Dank für deine Hilfe!


Anmelden zum Antworten