Endlose Schleife
-
Hallo
Ich habe das folgende Code geschrieben#include<stdio.h> main(int argc,char *argv[]){ if(argc<1){ return 1; } FILE *gerade,*ungerade,*beide; gerade = fopen("gerade.txt", "w+"); if (!gerade) { printf ("a konnte nicht geoeffnet werden!\n"); exit(0); } ungerade= fopen("ungerade.txt", "w+"); if (!ungerade) { printf ("b konnte nicht geoeffnet werden!\n"); exit(0); } char dateiName=strcat(argv[1], ".txt"); beide = fopen("dateiName", "w+"); if (!beide) { printf ("%s konnte nicht geoeffnet werden!\n",*argv[1]); exit(1); } int zahl=0; do { printf("Geben Sie die Zahlen,beim tippen von Null wird aufgehört\n"); scanf("%d",&zahl); if(zahl%2==0){ fprintf(gerade, "%d\n", zahl); } else{ fprintf(ungerade,"%d\n",zahl); } }while(zahl!=0); int wert; do { fscanf(gerade, "%d", &wert); if (!feof(gerade)) fprintf(beide, "%d\n", wert); } while (!feof(gerade)); fprintf(beide,"\n\n\n"); do { fscanf(ungerade, "%d", &wert); if (!feof(ungerade)) fprintf(beide, "%d\n", wert); } while (!feof(ungerade)); fclose(gerade); fclose(ungerade); fclose(beide); return 0; }
das programm sollte int zahlen bekommen bis es 0 gedruckt wird,und es musste 3 dateien geben,eins für gerade zahlen eins für ungerade und eins für beide am ende
nur ich habe es mit den geraden und ungeraden zahlen erledigt aber es gibt ein Problem mit dem while wenn ich versuche alle werte von den dateien ungerade und gerade auf die datei beide zu schreiben
kann jemand helfen bitte??
Danke:)
-
Reparier bitte erstmal deine Einrückung. Das ist ja unlesbar.
-
Schreib in Zeile 37 mal
rewind(gerade); rewind(ungerade);
Vielleicht hilft das
Edit:
Deine Einrückung ist wirklich schrecklich..
Was soll eigentlich Zeile 19 machen? Das würde ich mir noch mal überlegen
Zeile 22 auch falsch. argv wird schon durch [] einmal dereferenziert.
Zeile 3 kein int vor main()?!?
exit() ohne stdlib.h?
...Edit:
das programm sollte int zahlen bekommen bis es 0 gedruckt wird,und es musste 3 dateien geben,eins für gerade zahlen eins für ungerade und eins für beide am ende
Na wenn das die Anforderungen sind, gehts doch viel einfacher
(Habe deine Benennung mal übernommen, auch wenn ich deutsche Variablennamen extrem hässlich finde ;))#include <stdlib.h> #include <stdio.h> FILE *my_fopen(const char *name, const char *mode) { FILE *file = fopen(name, mode); if (!file) { perror(name); exit(-1); } return file; } int main(int argc, char *argv[]) { FILE *gerade, *ungerade, *beide; if (argc < 2) // argv[0] ist immer der Programmpfad, also ist argc immer >= 1 return -1; gerade = my_fopen("gerade.txt", "w+"); ungerade = my_fopen("ungerade.txt", "w+"); beide = my_fopen(argv[1], "w+"); // der Nutzer soll ruhig den ganzen Dateinamen bestimmen printf("Geben Sie die Zahlen ein; 0 = Ende\n"); while (1) { int n; if (scanf("%d", &n) != 1) break; // ungültige Eingabe if (!n) //n == 0 break; if (n % 2) // ungerade? fprintf(ungerade, "%d\n", n); else fprintf(gerade, "%d\n", n); fprintf(beide, "%d\n", n); } fclose(gerade); fclose(ungerade); fclose(beide); return 0; }
-
Nach dem schreiben stehen die Positionszeiger der Dateien am Dateiende.
Und da stehen halt keine Daten mehr.Du musst den Positionszeiger erst auf den Anfang stellen.
Entweder Datei schließen und im "r" Modus öffnen oder mit ftell() oder fsetpos() den Zeiger umstellen.oder (gerade noch bei cooky gesehen) mit rewind
-
DirkB schrieb:
Nach dem schreiben stehen die Positionszeiger der Dateien am Dateiende.
Und da stehen halt keine Daten mehr.Du musst den Positionszeiger erst auf den Anfang stellen.
Entweder Datei schließen und im "r" Modus öffnen oder mit ftell() oder fsetpos() den Zeiger umstellen.oder (gerade noch bei cooky gesehen) mit rewind
danke:)
-
cooky451 schrieb:
Schreib in Zeile 37 mal
rewind(gerade); rewind(ungerade);
Vielleicht hilft das
Edit:
Deine Einrückung ist wirklich schrecklich..
Was soll eigentlich Zeile 19 machen? Das würde ich mir noch mal überlegen
Zeile 22 auch falsch. argv wird schon durch [] einmal dereferenziert.
Zeile 3 kein int vor main()?!?
exit() ohne stdlib.h?
...Edit:
das programm sollte int zahlen bekommen bis es 0 gedruckt wird,und es musste 3 dateien geben,eins für gerade zahlen eins für ungerade und eins für beide am ende
Na wenn das die Anforderungen sind, gehts doch viel einfacher
(Habe deine Benennung mal übernommen, auch wenn ich deutsche Variablennamen extrem hässlich finde ;))#include <stdlib.h> #include <stdio.h> FILE *my_fopen(const char *name, const char *mode) { FILE *file = fopen(name, mode); if (!file) { perror(name); exit(-1); } return file; } int main(int argc, char *argv[]) { FILE *gerade, *ungerade, *beide; if (argc < 2) // argv[0] ist immer der Programmpfad, also ist argc immer >= 1 return -1; gerade = my_fopen("gerade.txt", "w+"); ungerade = my_fopen("ungerade.txt", "w+"); beide = my_fopen(argv[1], "w+"); // der Nutzer soll ruhig den ganzen Dateinamen bestimmen printf("Geben Sie die Zahlen ein; 0 = Ende\n"); while (1) { int n; if (scanf("%d", &n) != 1) break; // ungültige Eingabe if (!n) //n == 0 break; if (n % 2) // ungerade? fprintf(ungerade, "%d\n", n); else fprintf(gerade, "%d\n", n); fprintf(beide, "%d\n", n); } fclose(gerade); fclose(ungerade); fclose(beide); return 0; }
ja vielen dank dass du dich bemühst hast, nur zu deinen punkten
Deine Einrückung ist wirklich schrecklich..ja entschuldigung aber das habe ich später bemerkt ,weil beim kopieren ,formatiert das code sich selbst allen.
Was soll eigentlich Zeile 19 machen? Das würde ich mir noch mal überlegen
zu zeile 19,ich musste (wegen meienr aufgabestellung) die letzte dateiname(beide) von dem kommandozeile bekommen und ihn umbenennen, nur ich wußte nicht wie ich das machen konnte da ich berücksichtigen muss dass meine datei mit txt endet,aber es hat nicht geklappt deswegen habe ich zuerst es versucht mit irgendwelchem name und dann daran arbeite mit dem eingegebenen name die datei zu nennen.Zeile 22 auch falsch. argv wird schon durch [] einmal dereferenziert.
ja man bemerk dass ich ein schlechter c programmierer bin ,habe immer mit java gearbeitet und es ist ganz anders und so auch die letzte puntke , ich wusste nicht ich ich stdlib brauche für exit()
Zeile 3 kein int vor main()?!?
exit() ohne stdlib.h?
nur mein code sieht so aus jetzt#include <stdlib.h> #include <stdio.h> FILE *my_fopen(const char *name, const char *mode) { FILE *file = fopen(name, mode); if (!file) { perror(name); exit(-1); } return file; } int main(int argc, char *argv[]){ FILE *gerade, *ungerade, *beide; if (argc < 2) // argv[0] ist immer der Programmpfad, also ist argc immer >= 1 return -1; gerade = my_fopen("gerade.txt", "w+"); ungerade = my_fopen("ungerade.txt", "w+"); beide = my_fopen(argv[1], "w+"); // der Nutzer soll ruhig denganzenDateinamenbestimmen printf("Geben Sie die Zahlen ein; 0 = Ende\n"); while (1) { int n; if (scanf("%d", &n) != 1) break; // ungültige Eingabe if (!n) //n == 0 break; if (n % 2) // ungerade? fprintf(ungerade, "%d\n", n); else{ fprintf(gerade, "%d\n", n); fprintf(beide, "%d\n", n); } } rewind(ungerade); fprintf(beide,"\n"); int n; do{ fscanf(ungerade, "%d", &n); fprintf(beide,"%d\n",n); }while(!feof(ungerade)); fclose(gerade); fclose(ungerade); fclose(beide); return 0; }
ich hoffe dass mein code jetzt wider gut formatiert ist da es bei java einbisschen anders ist.
Danke:)
-
Joa, schon ok. So vielleicht noch etwas übersichtlicher:
int main(int argc, char *argv[]) { FILE *gerade, *ungerade, *beide; int n; // neu if (argc < 2) return -1; gerade = my_fopen("gerade.txt", "w+"); ungerade = my_fopen("ungerade.txt", "w+"); beide = my_fopen(argv[1], "w+"); printf("Geben Sie die Zahlen ein; 0 = Ende\n"); while (scanf("%d", &n) == 1) // neu { if (!n) break; if (n % 2) fprintf(ungerade, "%d\n", n); else { fprintf(gerade, "%d\n", n); fprintf(beide, "%d\n", n); } } rewind(ungerade); fprintf(beide, "\n"); while (fscanf(ungerade, "%d", &n) == 1) // neu fprintf(beide, "%d\n", n); fclose(gerade); fclose(ungerade); fclose(beide); return 0; }
Wenn man das n eh ausserhalb der Schleife braucht..