Problem mit strncmp



  • Hallo Comm,
    ich habe folgendes Problem.
    Ich hab zunächst ein Programm das eine .txt. Datei ausliest. Nun will ich dem Programm eine strncmp Funktion zufügen, mit der in der ersten Zeile der txt die ersten 4 Buchstaben überprüft werden, denn diese sollen immer _RBG sein, sonst soll das Programm schließen ( _ soll eigentlcih ein LEERZEICHEN sein!).
    Also hier einmal die txt Datei wie sie grob aussieht wobei es ja im Prinzip nur auf die ersten 4 Zeichen ankommt:
    "
    RBG
    Müller
    H.Lang
    18. 3.2008
    950.000000 5300.00000 1080.00000 2410.00000 0.00000000E+00
    19 1 0 0 0 0
    4210.00000 3010.00000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00
    4 3 0 0 0 0
    1 3 9 0 0 0 ..."

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char datnam[40] = "SPZ 180 .rbg";
                            /* nur global moeglich !!  */
    
    int main( void )
    {
            FILE * datei;   /* Struktur fuer Datei     */
            char zeile[80]; /* Annahme: max 80 Zeichen */
    
            datei = fopen( datnam, "r" );  /* r = read */
            if( datei == 0 )
            {
                    printf("Fehler: Datei existiert nicht");
                    return 1;
            }
    
            if(strncmp( str1, str2, 4) != 0)
                    printf("Sie haben die falsche Datei gewählt!!");
                    return 1;
    
            fgets( zeile, 79, datei );
            while( ! feof(datei) ) 
            {
                    printf("%s", zeile );
                    fgets( zeile, 79, datei );
            }
            getchar();
            fclose( datei );
            return 0;
    }
    

    das Problem istd as ich nicht mehr genau weiter weiss was ich mit dem str1 und dem str2 machen soll??

    Ich hoffe es ist verständlcih 😃



  • Hi!

    Es gibt mehrere Möglichkeiten, eine davon guckst du:

    #include <stdio.h>
    
    enum {linelen=80};
    const char* indenifier = " RGB";
    
    int main()
    {
    	char* file = "test.txt";
    	char buf [linelen+1] = {0};
    	FILE* fp = fopen(file,"r");
    	if ( fp == NULL )
    		return 0;
    	fgets (buf, strlen(indenifier)+1, fp);
    	if (0 != strcmp(buf,indenifier))
    		puts("Invalid file format.");
    	else 
    		puts ("Fileformat ok.");
    	fclose(fp);
    	return 0;
    }
    

    Gruß,
    B.B.



  • ich check das nicht, kannste das vllt in meins einbauen???



  • Was ist denn unverständlich?



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char datnam[40] = "SPZ 180 .rbg";
                                       /* nur global moeglich !!  */
    char zeile[80];                    /* Annahme: max 80 Zeichen */
    const char* indenifier = " RGB";
    
    int main( void )
    {
    
       	char buf [zeile+1] = {0};
            FILE* datei = fopen( datnam, "r" );  /* r = read */
    
            if( datei == 0 )  // statt 0=NULL?
            {
                    printf("Fehler: Datei existiert nicht");
                    return 1;
            }
    
            fgets( zeile, strlen(indenifier)+1, datei );
    
            if(strncmp( zeile, indenifier) != 0)
                    printf("Sie haben die falsche Datei gewählt!!");
                    return 1;
    
            while( ! feof(datei) )
            {
                    printf("%s", zeile );
                    fgets( zeile, 79, datei );
            }
            getchar();
            fclose( datei );
            return 0;
    }
    

    so ich habs nun so abgeändert aber irgendwie klappt das nciht 😞 und vor allem wir haben ja jetzt nirgends mehr angegeben wieviel zeichen überprüft werdn soltlen 😞 😕



  • Hier noch mal überarbeitet:

    #include <stdio.h>
    
    char datnam[40] = "test.txt"; 
                                       /* nur global moeglich !!  nö, auch lokal machbar!*/ 
    char zeile[80];                    /* Annahme: max 80 Zeichen */ 
    const char* identifier = " RGB"; 
    
    int main( void ) 
    { 
    
      FILE* datei = fopen( datnam, "r" );  /* r = read */ 
    
            if( datei == NULL )  // statt 0=NULL? Egal.
            { 
                    printf("Fehler: Datei existiert nicht"); 
                    return 1; 
            } 
    
            fgets( zeile, strlen(identifier)+1, datei ); 
    
            if(strncmp( zeile, identifier) != 0) 
    		{
                    printf("Sie haben die falsche Datei gewählt!!"); 
    				fclose(datei);
                    return 1; 
    		}
    
            while( NULL != fgets( zeile, 79, datei ) ) 
    			printf("%s", zeile ); 
    
    		getchar(); 
            fclose( datei ); 
            return 0; 
    }
    

    Die Anzahl der Zeichen wird beim Einlesen festgelegt.



  • also ich habe noch folgendes Problem... wenn ich das Programm so starte wie du mir das hier geschrieben hast kommt in der zeile mit der strncmp funktion immer ein fehler.
    und da die syntax
    int strncmp(const char *s1, const char *s2, size_t n);
    lautet
    hab ich die zeile nun so verändert

    if(strncmp( zeile, identifier, 4) != 0)
    

    und dann klappt das program aber es schließt sich immer sofort. ich hab da schon versucht ab und zu ein getchar(); zischen zu bauen aber es bringt nichts 😞
    also mein aktueller quellcode:

    #include <stdio.h>
    
    char datnam[40] = "SPZ 180 .rbg";
    char zeile[80];                    /* Annahme: max 80 Zeichen */
    const char* identifier = " RGB";
    
    int main( void )
    {
    
      FILE* datei = fopen( datnam, "r" );  /* r = read */
    
            if( datei == NULL ) 
            {
                    printf("Fehler: Datei existiert nicht");
                    return 1;
            }
    
            fgets( zeile, strlen(identifier)+1, datei );
    
            if(strncmp( zeile, identifier, 4) != 0)
            {
                    printf("Sie haben die falsche Datei gewählt!!");
                    fclose(datei);
                    return 1;
            }
    
            while( NULL != fgets( zeile, 79, datei ) )
                printf("%s", zeile );
    
            getchar();
            fclose( datei );
            return 0;
    }
    


  • Hast Recht, bei der überarbeiteten Version hab ich vergessen strncmp durch strcmp zu ersetzen.
    Kannst also if(strcmp( zeile, identifier) != 0)) schreiben, die Anzahl wird beim Einlesen berücksichtigt.

    Füge noch dort getchar ein, wo das Programm rausspringen kann, bei den return.
    Dann schließt sich auch nichts.

    Gruß,
    B.B.


Anmelden zum Antworten