Programm überspringt einen Teil
-
Hi,
(Ich bin noch ziemlciher Anfänger)[cpp] #include <stdio.h> #include <stdlib.h> #include <string.h> main(){ FILE *datei_ptr; char dateiname[15],zeile[80]; int antwort,ch; printf("\n\tArbeiten mit Dateien\n"); printf("\n Bitte Dateinamen eingeben >"); gets(dateiname); if((datei_ptr=fopen(dateiname,"r"))==NULL){ printf(" Die Datei existiert nicht und wird daher neu angelegt =>"); if ((datei_ptr=fopen(dateiname,"w"))!=NULL){ printf(" Anlegen erfolgreich!"); } } else { datei_ptr=fopen(dateiname,"w"); printf(" Die Datei wurde erfolgreich geoeffnet\n"); printf("\n\n Jetzt Dateiinhalt ausgeben? "); scanf("%i",&antwort); toupper(antwort); [b]if(antwort==74){ ch=fgetc(datei_ptr); if(ch<1){ printf("\n\tDie Datei ist leer!"); } while(!feof(datei_ptr)){ putchar(ch); ch=fgetc(datei_ptr); } }[/b] } printf("\n\n Bitte Text eingeben (Leerzeile beendet die Eingabe!)\n>"); gets(zeile); while(strlen(zeile)>0){ fprintf(datei_ptr,"%s\n",zeile); printf(">"); gets(zeile); } printf("\n\n Die Datei wurde erfolgreich bearbeitet!\n\n\n\n"); system("PAUSE"); } [/cpp]
Den markierten Teil führt das Programm nicht aus, aber wieso nicht?
-
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { FILE *datei_ptr; char dateiname[15], zeile[80], antwort; int ch; printf("\n\tArbeiten mit Dateien\n"); printf("\n Bitte Dateinamen eingeben >"); gets(dateiname); if (!(datei_ptr = fopen(dateiname, "r"))) { printf(" Die Datei existiert nicht und wird daher neu angelegt =>"); if ((datei_ptr = fopen(dateiname, "w"))) { printf(" Anlegen erfolgreich!"); } } else { datei_ptr = fopen(dateiname, "w"); printf(" Die Datei wurde erfolgreich geoeffnet\n"); printf("\n\n Jetzt Dateiinhalt ausgeben? "); scanf("%c", &antwort); if (antwort == 'j') { ch = fgetc(datei_ptr); if (ch < 1) { printf("\n\tDie Datei ist leer!"); } while (!feof(datei_ptr)) { putchar(ch); ch = fgetc(datei_ptr); } } } printf("\n\n Bitte Text eingeben (Leerzeile beendet die Eingabe!)\n>"); gets(zeile); while (strlen(zeile) > 0) { fprintf(datei_ptr, "%s\n", zeile); printf(">"); gets(zeile); } printf("\n\n Die Datei wurde erfolgreich bearbeitet!\n\n\n\n"); system("PAUSE"); return EXIT_SUCCESS; }
Du hast versucht ein Zeichen in einen Dezimalwert umzuwandeln. Das klappt so natürlich nicht. Ich hab das mal so geändert, dass das Zeichen eingelesen wird.
Den Fehler hättest du übrigens bemerkt, wenn du 74 eingegeben hättest, dass wäre die Abfrage nämlich 1 gewesen...
scanf() hat übrigens einen Rückgabewert, anhand dem du gucken kannst ob die Eingabe erfolgreich war. Ein Link dazu.Das Umwandeln deines Zeichens in einen Großbuchstaben kannst dir eigentlich sparen - würde mit einem char sowieso nicht funktionieren. .
In deiner ersten while-Schleife ist noch ein Fehler, den darfst aber selbst beheben.
Hab meine IDE deinen Code noch gescheit formatieren lassen, außerdem hab ich dir die "richtige" main-Funktion hingeschrieben. Abfragen auf NULL sind verkürzbar. Und gets() sollte auch nicht mehr verwendet werden...
-
Antoras schrieb:
Abfragen auf NULL sind verkürzbar.
...fördern für noch unsichere Anfänger aber nicht unbedingt die Lesbarkeit.
@Mr.Tactic: Du musst dringend an deiner Einrückung arbeiten. Sobald deine Programme größer werden, wirst du sehr schnell den Überblick verlieren, wenn du nicht vernünftig einrückst. Was zu lesen:
http://de.wikipedia.org/wiki/Einrückungsstil
http://de.wikipedia.org/wiki/Quelltextformatierung
-
Danke für eure Hilfe
-blöd int zu nehmen.
Inwiefern funktioniert das toupper bei char nicht also bei mir funktioniert das wunderbar.
Den Fehler bei der while-schleife sehe ich im Moment leider nicht- bin wahrscheinlich gerade nur blind, aber jedenfalls merke ich, dass es eine Endlosscheife ist.
p.s. ich muss ehrlich sagen ich blicke bei meiner Formatierung schneller durch als bei deiner...ich werds versuchen; habt bitte verständnis dafür, dass ich es von den funktionen her erstmal so machen werde, wie es in meinem buch steht.
edit: weiß jemand von euch, wie man mit devcpp den code formatieren lassen kann?
-
Hm ich seh den Fehler in der Schleife immernoch nicht
Kann mir den bitte einer sagen?
-
Mr.Tactic schrieb:
p.s. ich muss ehrlich sagen ich blicke bei meiner Formatierung schneller durch als bei deiner...
Das ist nicht dein Ernst, oder?
Eine vernünftige Einrückung sorgt für Struktur und Lesbarkeit. Bei deinem Code ist beides nur bedingt vorhanden. Beim Öffnen eines Blocks (immer erkennbar durch die geschweifte, öffnende Klammer; außer bei Einzeilen-Schleifen und -Bedingungen) rückst du ein, beim Schließen gehst du wieder die gleiche Anzahl an Leerzeichen zurück (oder du nimmst Tabs).
void foo() { if() { while() { for() { if() { ... }else if() { ... }else { ... } } } if() { ... } } }
So kannst du an der Einrückung vertikal entlang wandern, um zu sehen bis wohin ein Block geht. Anfang und Ende eines Blocks sind so auch optisch auf einer Ebene. Über die genaue Notation lässt sich streiten (z.B. spendieren viele der öffnenden Klammer lieber eine eigene Zeile), aber die Einrückung ist letztlich immer gleich und nur so macht sie Sinn.
Bei dir sieht's dann so aus:
if(antwort==74){ ch=fgetc(datei_ptr); if(ch<1){ printf("\n\tDie Datei ist leer!"); } while(!feof(datei_ptr)){ putchar(ch); ch=fgetc(datei_ptr); } } }
Willst du mir erzählen, dass du direkt sagen kannst, welche Klammer zu welchem Block gehört?
-
if(antwort==74){ ch=fgetc(datei_ptr); if(ch<1){ printf("\n\tDie Datei ist leer!"); } while(!feof(datei_ptr)){ putchar(ch); ch=fgetc(datei_ptr); } }
Hier ist die Formatierung durchs Forum verloren gegangen- das war vorher anders.
Ich finde aber wirklich, dass hier z.B. die Klammern viel schneller zuordnen kann.
Nämlich indem man die Klammern an gleicher Position untereinander schreibt.
Gut ich habe hier auch den Inhalt der Schleife entsprechend ausgerichtet, aber das werde ich in Zukunft nicht mehr machen(sonst muss ich ziemlich scrollen).while(strlen(zeile)>0){ fprintf(datei_ptr,"%s\n",zeile); printf(">"); gets(zeile); }
Bei mehr Verschachtelung wird es vll. unübersichtlicher das kann sein, aber das ist nunmal Ansichtssache. Ich werde aber es so zu machen, wie du sagst.
Kann mir jetzt bitte noch einer meine Frage beantworten?
-
Ich werde aber es so zu machen, wie du sagst.
Das musst du nicht, aber es ist ein guter Vorschlag.
Alternativ siehe http://en.wikipedia.org/wiki/Indent_style
-
datei_ptr = fopen(dateiname, "w"); printf(" Die Datei wurde erfolgreich geoeffnet\n"); printf("\n\n Jetzt Dateiinhalt ausgeben? "); scanf("%c", &antwort); if (antwort == 'j') { ch = fgetc(datei_ptr); if (ch < 1) { printf("\n\tDie Datei ist leer!"); } while (!feof(datei_ptr)) { putchar(ch); ch = fgetc(datei_ptr); } }
Du möchtest aus der Datei lesen, öffnest sie aber zum Schreiben.
Nimm dochdatei_ptr = fopen(dateiname, "r");
-
Achso stimmt, vielen Dank.