Windows Fehler - Programmabbruch



  • Da hilft nur eins: Das Array per printf() vor und nach sort() ausgeben lassen.



  • ja, das habe ich ja schon gemacht!!

    Ich bekomme immer nur die gleiceh zahl ausgegeben!!
    Ich gebe es auf!! Krieg ich nicht gebacken...

    danke trotzdem



  • #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void sort(int arr[], int n)
    {
      int i, j, temp;
    
      for (i = n; i > 0; i--)
          for (j = 0; j < i-1; j++)
    		  if (arr[j] > arr[j+1])
    		      { temp     = arr[j];
                    arr[j]   = arr[j+1];
                    arr[j+1] = temp;
                  }
    }
    
    int main()
    {
      FILE *infp, *outfp;
      int n, i;
      int *p;
      char buf[10];
      char filename1[40];
      char filename2[40];
    
      printf("Input-Datei: ");
      scanf("%s",filename1);
      printf("Output-Datei: ");
      scanf("%s",filename2);
    
      if ((infp = fopen(filename1, "rt")) == 0)
        { printf("Datei mit dem Namen %s konnte nicht geoeffnet werden\n", filename1);
          return 0;
        }
      if ((outfp = fopen(filename2, "wt")) == 0)
    	{ printf("Datei mit dem Namen %s konnte nicht geoeffnet werden\n", filename2);
          fclose(infp);
          return 0;
        }
    
      fgets(buf, sizeof(buf), infp);
      n = atol(buf);
      p = malloc(n*sizeof(int));
      for (i = 0; i < n; i++)
    	{ fgets(buf, sizeof(buf), infp);
    	  p[i] = atol(buf);
        }
    
      sort(p, n);
    
      for (i = 0; i < n; i++)
          fprintf(outfp, "%i\n", p[i]);
    
      fclose(infp);
      fclose(outfp);
      free(p);
      return 0;
    }
    


  • und was ist jetzt anders an dem sortierverfahren? An/Mit dem i haste nichts geändert!

    Und deine Lösung bringt mich immer noch nicht voran, da ich es mit fgetc lösen möchte!

    hmm...



  • sheddy schrieb:

    Ich weiß nicht, wo da das problem liegt?!

    Falls Du nicht an CopyAndPaste interessiert bist :

    int* ReadNumbers(FILE *fin, int *n)
    {
    
    (...)
    
     c=fgetc(fin);
     for(i=0;i<(*n);i++)
     {
       while((c!='\n')&&(c!=EOF)) // <- Falls c=='\n' (z.B. nach dem zweiten eingelesenem Zeichen)
       {                          //    geht das Programm nicht mehr in die while()-Schleife !
        CharNum[k++]=c;
        c=fgetc(fin);
       }
    
       value=atoi(CharNum);
       numbers[i]=value;
       printf("Zahl %d:%d\n",i+1,value);
    
     }
    
    (...)
    
    }
    


  • Also, ich weiß, dass es nur am auslesen der Datei liegt!

    Obwohl das hier für die erste Zahl, also die Anzahl der Zahlen, in der datei funktioniert:

    count=(char*)malloc(5*sizeof(char));
    
    	while(((c=fgetc(fin))!='\n')&&(c!=EOF))
    		count[i++]=c;
    
    	value=atoi(count);
    	(*n)=value;
    

    funktionieren diese für die restlichen zahlen nicht mehr:
    (meine Versuche)

    1.versuch

    numbers=(int*)malloc((*n)*sizeof(int));
    	CharNum=(char*)malloc(125*sizeof(char));
    
    	for(i=0;i<(*n);i++)
    	{
    		k=0;
    		while(((c=fgetc(fin))!='\n')&&(c!=EOF))
    		{
    			CharNum[k++]=c;	
    
    			value=atoi(CharNum);
    			numbers[i]=value;
    			printf("%d\n",numbers[i]);
    		}				
    	}
    

    Ach, ich habe diese for-schleife sicherlich 10x umgeschrieben, mit und ohne if-bedingungen, die bedingungen für die while schleife verändert und und und!!
    NIX ZU MACHEN!!!

    fgetc zählt doch alles, was in einer txt drin ist oder?!
    Zählt es auch Leerzeilen und '\n'?

    Ich habe die for bzw. die while schleife jetzt so verändert:

    for(i=0;i<(*n);i++)
    	{
    		k=0;
    		while((c=fgetc(fin))!=EOF)
    		{
    			CharNum[k++]=c;	
    
    			if(c=='\n'){
    				value=atoi(CharNum);
    				numbers[i]=value;
    				printf("%d\n",numbers[i]);
    			}
    		}
    
    	}
    

    Funktioniert aber immer noch nicht! Sollte es aber... 😡



  • Die zweite Schleife sieht gut aus. Allerdings fehlt ein "break" :

    for(i=0;i<(*n);i++)
     {
      k=0;
      while((c=fgetc(fin))!=EOF)
      {
       CharNum[k++]=c;    
    
       if(c=='\n'){
        value=atoi(CharNum);
        numbers[i]=value;
        printf("%d\n",numbers[i]);
        break; // <- sonst stimmt das Zusammenspiel mit der for - Schleife nicht mehr !
       }
      }
     }
    

    ( -> Das letzte Zeichen in der "in.txt" muss dann aber ein '\n' sein !)



  • verdammt, jetzt hast du kurz vor mir geantwortet! Bin gerade auf die Lösung gekommen!!
    Im moment sieht sie so aus:

    numbers=(int*)malloc((*n)*sizeof(int));
    	CharNum=(char*)malloc(125*sizeof(char));
    
    	i=0;
    	while((c=fgetc(fin))!=EOF)
    	{
    		CharNum[i++]=c;
    		if(c=='\n')
    		{
    			value=atoi(CharNum);
    			numbers[k++]=value;
    			i=0;
    		}
    
    	}
    

    An das break musste ich auch denken. Dachte aber immer, wenn ich das in die if-bedingung schreibe, dass es dann die while schleife beendet, also die nächst höher gelegene!



  • Diese Lösung (ohne for () - Schleife) braucht kein "break".
    Nicht vergessen : -> Das letzte Zeichen in der "in.txt" muss ein '\n' sein !



  • jojo..verstehe!

    Das mit dem '\n' verstehe ich! Die Zahlen stehen bei mir in der txt auch untereinander, ansonsten müsste ich ja die if-bedingung ändern! 😃

    Nun gut..ich werde mal weiterprobieren! vielen dane schonmal 😃


Anmelden zum Antworten