Hilfe Programm Dateiverarbeitung



  • Yannick schrieb:

    Wenn ich die for-Schleife mit einem

    while (ptr != EOF)
    

    austausche, erscheint eine Fehlermeldung

    Dafür dass du Zeitdruck hast, lümmelst du hier ganz schön unnötig herum:
    WAS FÜR EINE FEHLERMELDUNG?
    Warum steht vor deiner Funktion eigentlich ein "int"?



  • maddin900 schrieb:

    Yannick schrieb:

    Wenn ich die for-Schleife mit einem

    while (ptr != EOF)
    

    austausche, erscheint eine Fehlermeldung

    Dafür dass du Zeitdruck hast, lümmelst du hier ganz schön unnötig herum:
    WAS FÜR EINE FEHLERMELDUNG?
    Warum steht vor deiner Funktion eigentlich ein "int"?

    Ich sitze leider von morgens bis abends an dem Projekt, aber komme leider kaum voran.

    void datei_oeffnen_lesen(char *dateiname)
    {
    	FILE *ptr;
    	int i;
    	char temp[5];
    	char kurve[]				= "CONS";
    	char kurve_auf_flaeche[]	= "CURVE";
    	char traegerflaeche[] 		= "SURF";
    
    	int zaehler_kurve = 0;
    	int zaehler_kurve_auf_flaeche = 0;
    	int zaehler_traegerflaeche = 0;
    
    	ptr = fopen (dateiname, "r");
    
    	if (ptr == NULL) {
    			printf("\nIch konnte die Datei nicht oeffnen!");
    	}
    
    	else {
    			printf("\nDie Datei wurde geoeffnet!\n");
    
    		for (i=0; i<1000 ;i++){	
    				fscanf(ptr,"%99s", &temp);
    				printf("gelesen:%s\n", temp);
    
    					if(strcmp(temp, kurve)== 0) {
    						zaehler_kurve++;
    						printf("Datei enthaelt Kurven %i mal\n", zaehler_kurve);
    				}
    			}
    		}
    		fclose (ptr);
    
    	printf("\n\n");
    }
    

    Das habe ich bisher.

    Wenn ich stattdessen eine while Schleife verwende:

    while (ptr != EOF){	
    				fscanf(ptr,"%99s", &temp);
    				printf("gelesen:%s\n", temp);
    
    					if(strcmp(temp, kurve)== 0) {
    						zaehler_kurve++;
    						printf("Datei enthaelt Kurven %i mal\n", zaehler_kurve);
    				}
    

    erscheint die Fehlermeldung: operands of != have illegal types 'pointer to struct_iobuf' + and 'int'



  • Wenn du von morgens bis abends an dem Projekt sitzen würdest wärst du schon fertig. Bist du mal auf die Idee gekommen zu schauen was es mit der Fehlermeldung auf sich hat? Oder dir mal angeschaut, wie man FILE benutzt? Es gibt wie gesagt 1 Millarde Beispiele, und DU willst hier erklären dass du von morgens bis abends daran "arbeitest" und es nicht hinbekommst?! Das glaubt dir hier niemand!



  • ptr ist auch ein dateihandle, während EOF eine ganzzahl ist.

    also solltest du erst einmal herausfinden, wie du überprüfst, ob das dateiende erreicht ist: http://www2.hs-fulda.de/~klingebiel/c-stdlib/index.htm



  • ptr ist ein Zeiger (auf eine FILE Struktur)
    EOF ist ein Makro was (meist) als -1 definiert ist.

    Das passt nicht zusammen. (Ein Zeiger ist kein int)

    Es gibt die Funktion feof im der Standard-Library.
    Du kannst den Status aber erst nach der Leseoperation abfragen, daher ist diese while-Schleife auch nicht richtig.

    Kannst du mit "Rückgabewert einer Funktion" etwas anfangen?
    Ja, dann schau mal http://www.cplusplus.com/reference/cstdio/fscanf/bei unter Return Value.
    Nein, dann mach dich darüber mal schlau.



  • Danke für die Tips!

    void datei_oeffnen_lesen(char *dateiname)
    {
    	FILE *ptr;
    	int i;
    	char temp[5];
    	char kurve[]				= "CONS";
    	char kurve_auf_flaeche[]	= "CURVE";
    	char traegerflaeche[] 		= "SURF";
    
    	int zaehler_kurve = 0;
    	int zaehler_kurve_auf_flaeche = 0;
    	int zaehler_traegerflaeche = 0;
    
    	ptr = fopen (dateiname, "r");
    
    	if (ptr == NULL) 
    	{
    		printf("\nIch konnte die Datei nicht oeffnen!");
    	}
    
    	else 
    	{
    		printf("\nDie Datei wurde geoeffnet!\n");
    
    		while(!feof(ptr)) //solange Datei nicht dem Ende angekommen ist
    		{	
    			fscanf(ptr,"%99s", &temp);
    			//printf("gelesen:%s\n", temp);
    
    				if(strcmp(temp, kurve)== 0) 
    				{
    					zaehler_kurve++;
    				}
    			}
    		printf("Datei enthaelt Kurven %i mal\n", zaehler_kurve);
    		}
    		fclose (ptr);
    
    	printf("\n\n");
    }
    

    Mit der Schleife While(!feof(ptr)) läuft er jetzt nur bis zum Ende und speichert die Anzahl der gesuchten Strings in die Variable zaehler_kurve.

    Allerdings erscheint in der Konsole dies:

    Es soll die Datei
    C:\EDV\lcc\lcc\Projekte\EDV2_Projekt\Testdateien\Test_CONS.txt
     geoeffnet werden
    Die Datei wurde geoeffnet!
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:CONS
    gelesen:HANS
    gelesen:WURST
    gelesen:CONS
    Datei enthaelt Kurven 10 mal
    
    abnormal program termination
    
    "c:\edv\lcc\lcc\projekte\edv2_projekt\lcc\projekt1.exe"
    Return code 3
    Execution time 7.017 seconds
    Press any key to continue...
    

    Kann das jemand deuten?



  • Also das "abnormal program termination".



  • Nimm das mal solange:

    while (fgets(temp, sizeof temp, ptr) != NULL){
    	printf("gelesen:%s", temp);
    }
    

    🙄



  • maddin900 schrieb:

    Nimm das mal solange:

    while (fgets(temp, sizeof temp, ptr) != NULL){
    	printf("gelesen:%s", temp);
    }
    

    🙄

    Danke. Das Problem ist aber, dass er mir jetzt die Leerzeichen mitausgibt.
    Bräuchte aber jeweils 1 Wort je temp Variable, damit ich sie vergleichen kann.



  • DirkB schrieb:

    Es gibt die Funktion feof im der Standard-Library.
    Du kannst den Status aber erst nach der Leseoperation abfragen, daher ist diese while-Schleife auch nicht richtig.

    maddin900 schrieb:

    Nimm das mal solange:

    while (fgets(temp, sizeof temp, ptr) != NULL){
        printf("gelesen:%s", temp);
    }
    

    fgets ist hier nicht geeignet, da er Wörter zählen möchte.
    Zudem speichert fgets das \n mit im String ab, was das strcmp erschwert.
    Das sinnvolle an dem Tipp ist, die Leseoperation in der while- Bedingung zu machen und den Rückgabewert auszuwerten.
    Das geht auch mit fscanf . Man muss nur den richtigen Vergleichswert nehmen. NULL ist es nicht


Anmelden zum Antworten