Programm läuft amok Hilfe!



  • Es muß einmal strcpy(ende->name, t_name); heißen.
    Außerdem mußt Du dein Programm so starten:
    aufgabe36 dat.txt
    Die get_data()-Funktion muß daraufhin die übergebene Datei zeilenweise auslesen, und nicht, wie Du, die Zeilen von stdin einlesen!!!???!!!

    Was das Menü betrifft, so vermeide scanf(), das macht immer Probleme wegen der unbekannten int-Größe; besser gets() verwenden:

    int main(int argc, char** argv)
    {
    	char puffer[999];
    	char* datei;
    
    	if(argc < 2)
    	{
    		printf("Welche Datei soll geladen werden? ");
    		gets(puffer);
    		datei = puffer;
    	}
    	else
    		datei = argv[1];
    
    	get_data(datei);
    
    	for(;;)
    	{
    		puts("Wählen Sie!");
    		puts("(1) Nach Namen suchen in der Telefonliste");
    		puts("(2) Programm beenden");
    
    		gets(puffer);
    
    		switch(*puffer) 
    		{
    		case '1':
    			search(enter());
    			break;
    		case '2':
    			free_element();
    			return 0;
    		default:
    			printf("Ungültige Eingabe!");
    		}
    	}
    }
    


  • Ich habe das mal von dir übernommen aber nun stürzt das Programm ab habe das mal so abgändert... es stürtzt dann ab wenn es anfängt einzuleisen... die eingabe funzt....

    Danke dir dasdu mir so hilfst!

    void get_data(char *dat)
    {
        char line[256], *a, *b;
        long temp_index, temp_number;
        int i; 
    
            while(fgets(line, sizeof(line),dat))
                {
                        temp_index=strtol(line, &a, 10);
                        temp_number=strtol(a, &b, 10);
                        fflush(stdin);
                        add_element(temp_index,temp_number, b);
    
                }
    
    }
    

    Hier noch die Warnung vom Compiler:
    [Warning] passing arg 3 of `fgets' from incompatible pointer type



  • Hallo,

    du mußt erst einmal die Datei öffnen, bevor du mit fget lesen kannst. Hier einmal eine Änderung zum bisherigen Code:

    int get_data(const char *dat) 
    { 
        char line[256], *a, *b; 
        long temp_index, temp_number; 
        FILE *stream;
        int noerror = 1;
    
        if( (stream = fopen( dat, "r" )) != NULL )
        {
             while(fgets(line, sizeof(line),stream)) 
             { 
                        temp_index=strtol(line, &a, 10); 
                        temp_number=strtol(a, &b, 10); 
                        fflush(stdin); 
                        add_element(temp_index,temp_number, b); 
    
             }
    
             if (!feof(stream)) noerror = 0;
    
             fclose( stream );
         }
         else
             noerror = 0;
    
         return noerror;
    }
    

    in main kann dann die Funktion so eingesetzt werden:

    ...
    ...
        if(argc < 2)
        {
            printf("Welche Datei soll geladen werden? ");
            gets(puffer);
            datei = puffer;
        }
        else
            datei = argv[1];
    
    if (!get_data(datei)) 
    {
       printf("\nFehler beim Einlesen\n");
       return 1;
    }
    
        for(;;)
        {
      ........
      ........
      ........
    

    MfG



  • Krösus schrieb:

    ...besser gets() verwenden:...

    Anstatt gets() wäre fgets() besser, da man bei fgets() einen Bufferoverflow abfangen kann!



  • AJ schrieb:

    Anstatt gets() wäre fgets() besser, da man bei fgets() einen Bufferoverflow abfangen kann!

    korrekt, "secure programming" ist angesagt, aber bei mir nicht mehr um "02:50:16 03.03.2004" :), um die Zeit war nur noch copy & paste drin...

    MfG



  • wofür das feof?

    Danke!



  • die Abfrage auf feof stellt sicher, daß die Datei auch fehlerfrei eingelesen wurde. Wenn feof nicht erkannt wurde, dann muß ein anderer Fehler schon beim Lesen (mittendrin) passiert sein (z.B. nicht vollständig eingelesen). Wurde feof erkannt, dann ist mit dem Verlassen der while-Schleife auch klar, daß wirklich alles eingelesen wurde (weil feof prüft, ob man bis zum Datei-Ende gekommen ist)

    MfG



  • Wie kann ich eigentlich sagen das er beim einlesen die Leerzeilen überspringt sondern nur die Werte nimmt? geht das mit fgets?



  • Nein mit fgets() nicht, aber mit fscanf().



  • Oh man das heißt das Ganze Prog ist am Ars. Egal habe dabei etwas gelernt!


Anmelden zum Antworten