Windows Fehler - Programmabbruch
-
Hi!
Ich habe folgendes Programm geschrieben!
Es soll Zahlen aus einer Datei einlesen, wobei die erste Zahl in der Datei angibt, wieviel zahlen drin enthalten sind und am Ende sortiert in eine andere Datei geschrieben wird!Ich weiß, es wäre einfacher mit fscanf und fprintf zu lösen! Das habe ich auch geschafft! Aber jetzt will ich es mit fgetc und fputc machen! Beim compilieren bringt er keinen Fehler, jedoch bei der Ausführung!
Hier mein Code:#include <stdio.h> #include <stdlib.h> #include <string.h> void WriteNumbers(FILE *fout, int *arr, int n) { int i; for(i=0;i<n;i++) fprintf(fout,"%d\n",arr[i]); } int* ReadNumbers(FILE *fin, int *n) { char *count, *CharNum; int i,k,c,value,*numbers; i=k=value=0; count=(char*)malloc(5*sizeof(char)); while((c=fgetc(fin))!=EOF) count[i++]=c; value=atoi(count); (*n)=value; printf("%d",value); numbers=(int*)malloc((*n)*sizeof(int)); CharNum=(char*)malloc(125*sizeof(char)); for(i=0;i<(*n);i++) { while((c=fgetc(fin))!=EOF) CharNum[k++]=c; value=atoi(CharNum); numbers[i]=value; } free(CharNum); free(count); return numbers; } 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; } return; } void main (void) { int n, *p; FILE *infp, *outfp; char filename1[40]; char filename2[40]; printf("Input-Datei: "); scanf("%s",filename1); fflush(stdin); printf("Output-Datei: "); scanf("%s",filename2); fflush(stdin); if ((infp = fopen(filename1,"r")) == NULL ) { printf("Datei mit dem Namen %s konnte nicht geoeffnet werden\n",filename1); exit(1); } if ((outfp = fopen(filename2,"w")) == NULL ) { printf("Datei mit dem Namen %s konnte nicht geoeffnet werden\n",filename2); exit(1); } p = ReadNumbers(infp, &n); sort(p,n); WriteNumbers(outfp, p, n); fclose(infp); fclose(outfp); free(p); }
Die txt-Datei ist in dieser Art aufgebaut:
8 5 -2 9 24 67 -34 6 4
Kann mir jemand sagen, was ich falsch gemacht habe?
Ich glaube bzw. ich weiß, dass es einen Fehler in der Funktion ReadNumbers gibt!
Ich hoffe, ich blickt dadurch
gruß sdy
-
arrays gehen von [0] bis [laenge-1]
dein sort code sieht fehlerhaft aus.beim einlesen terminierst du den kram in "count" nicht. strings sind nullterminiert. atoi wird probleme haben. malloc returnt pointer auf uninitialisieren speicher.
-
arrays gehen von [0] bis [laenge-1]
dein sort code sieht fehlerhaft aus.Der Sort-code ist richtig! Ich habe das gleiche Programm ja auch mit fscanf und fprintf gelöst und es hat funktioniert! Das ist der ganz normale Bubble-Sort Algorithmus!
beim einlesen terminierst du den kram in "count" nicht.
Wo habe ich das denn gemacht? Ich weiß nicht wo!
malloc returnt pointer auf uninitialisieren speicher.
hmm?!?! Ich gebe erst mit malloc speicher auf dem heap frei und gebe den pointer zurück an main! Also existiert der Speicher auf dem Heap noch und man kann in der main funktion mit p wieder drauf zu greifen! Ansonsten weiß ich nicht, was du meinst
Auf alle Fälle habe ich den Code noch einmal überarbeitet und sieht jetzt wie folgt aus:
#include <stdio.h> #include <stdlib.h> #include <string.h> void WriteNumbers(FILE *fout, int *arr, int n) { int i; for(i=0;i<n;i++){ fprintf(fout,"%d\n",arr[i]); } } int* ReadNumbers(FILE *fin, int *n) { char *count, *CharNum; int i,k,c,value,*numbers; i=k=value=0; count=(char*)malloc(5*sizeof(char)); c=fgetc(fin); while((c!='\n')&&(c!=EOF)) { count[i++]=c; c=fgetc(fin); } value=atoi(count); (*n)=value; printf("%d\n",(*n)); numbers=(int*)malloc((*n)*sizeof(int)); CharNum=(char*)malloc(125*sizeof(char)); c=fgetc(fin); for(i=0;i<(*n);i++) { while((c!='\n')&&(c!=EOF)) { CharNum[k++]=c; c=fgetc(fin); } value=atoi(CharNum); numbers[i]=value; printf("Zahl %d:%d\n",i+1,value); } free(count); free(CharNum); return numbers; } 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; } return; } void main (void) { int n, *p; FILE *infp, *outfp; char filename1[40]; char filename2[40]; printf("Input-Datei: "); scanf("%s",filename1); fflush(stdin); printf("Output-Datei: "); scanf("%s",filename2); fflush(stdin); if ((infp = fopen(filename1,"r")) == NULL ) { printf("Datei mit dem Namen %s konnte nicht geoeffnet werden\n",filename1); exit(1); } if ((outfp = fopen(filename2,"w")) == NULL ) { printf("Datei mit dem Namen %s konnte nicht geoeffnet werden\n",filename2); exit(1); } p = ReadNumbers(infp, &n); sort(p,n); WriteNumbers(outfp, p, n); fclose(infp); fclose(outfp); free(p); }
Das Programm funkioniert auch soweit, jedoch nicht so wie ICH es will
Sei die Datei folgender Maßen aus:
4 3 6 7 2
Dann liest er die erste Zahl (hier: 4) ein, wandelt sie um etc.. Jedoch gibt er am Ende nur die zweite Zahl aus (hier: 3) und das 4 mal!
-
sheddy schrieb:
void main (void)
Wie hieß denn diesmal der Professor?
-
ist ja gut
int main void!
Aber ich habe nochmal nachgefragt und er meinte, dass es egal ist, ob man int oder void nimmt! Es kommt eben nur drauf an, ob das Bestriebssystem einen Wert erwartet oder nicht!
-
Nur Hellseher wissen, auf welchen Betriebssystemen/Umgebungen (z.B. von einer Batchdatei aus) in Zukunft das Programm gestartet wird, deshalb:
a) int main(int argc, char *argv[], char *envp[]) b) int main(int argc, char *argv[]) c) int main()
-
hä?
Die Funktion sort ist doch akkurat!!
Alle Variablen sind lokal in der Fkt. deklariert und durchlaufen perfekt das array! Ich weiß nicht, wo da das problem liegt?!
es hat ja vorher auch funktioniert!
-
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