+ in char
-
Hi, erstmal code.
#include <stdio.h> #include <errno.h> FILE *Fd1; void warfopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", &datei); if ( zeich == "r" || "w" || "a" || "r+" || "w+"|| "a+") { if ( (Fd1 = fopen (datei, zeich)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde geoeffnet!\n\n"); } else printf("Falsches Zeichen!\n"); } void warfreopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", &datei); if ( zeich == "r" || "w" || "a" || "r+" || "w+"|| "a+") { if ( (Fd1 = freopen (datei, zeich, Fd1)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde erneut geoeffnet!\n\n"); } else printf("Falsches Zeichen!\n"); } void warfclose () { if ( fclose (Fd1) ) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde geschlossen!\n"); } void warerror () { if ((stdin || stdout) != 0){ printf("Keine Datei angegeben!\n"); } else { if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { if (ferror (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein Fehler!\n"); if (feof (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein EOF!\n"); } } } void warclearerr () { if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { clearerr (Fd1); printf("Flags werden jetzt geloescht!\n"); } } void getputchar () { int zeichen; printf("Alle eingegebenen Zeichen werden gleich auf den Monitor ausgegeben!\n"); if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while ( (zeichen = getchar ()) != EOF) putchar (zeichen); } } void wargetc () { printf("Mit STRG + D beenden.\n"); if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while (getc(Fd1) != EOF) ; printf("Ende der Eingabe mit getc!\n"); } } void warfgetc () { printf("Mit STRG + D beenden.\n"); if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while (fgetc(Fd1) != EOF) ; printf("Ende der Eingabe mit getc!\n"); } } void warputc () { printf("Mit STRG + D beenden.\n"); int zeichen; printf("Geben Sie ein oder mehrere Zeichen ein:\n"); while ( (zeichen = getchar() ) != EOF) ; if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while (putc(zeichen,Fd1) != EOF) ; printf("Ende der Eingabe mit getc!\n"); } } void warfputc () { printf("Mit STRG + D beenden.\n"); int zeichen; printf("Geben Sie ein oder mehrere Zeichen ein:\n"); while ( (zeichen = getchar() ) != EOF) ; if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while (fputc(zeichen,Fd1) != EOF) ; printf("Ende der Eingabe mit getc!\n"); } } int main (void) { int m1, m2; for (;;) { // m1 printf("[1] fopen - Oeffnen einer Datei.\n"); printf("\t\tFILE *fopen (const char *datei, const char *modus)\n\n"); printf("[2] freopen - Oeffnen einer Datei mit bereits existierendem Stream.\n"); printf("\t\tFILE *freopen (const char *datei, const char *modus, FILE *fz)\n\n"); // fz = File Zeiger printf("[3] fclose - Schliessen einer Datei.\n"); printf("\t\tint fclose (FILE *fz);\n\n"); printf("[4] feof/ferror - Pruefen des EOF-und Fehler-Flags\n"); printf("\t\tint feof (FILE *fz);\n\t\tint ferror (FILE *fz);\n\n"); printf("[5] clearerr - Loeschen des Fehler-und EOF-Flags\n"); printf("\t\tvoid clearerr (FILE *fz);\n\n"); printf("[6] getchar - Lesen eines Zeichen von stdin\n"); printf("\t\tint getchar (void);\n"); printf(" putchar - Schreiben eines Zeichen auf stdout\n"); printf("\t\tint putchar (int zeichen);\n\n"); printf("[7] getc - Lesen eines Zeichens aus einer Datei\n"); printf("\t\tint getc (FILE *fz);\n"); printf("[8] fgetc - Lesen eines Zeichens aus einer Datei\n"); printf("\t\tint fgetc (FILE *fz)\n\n"); printf("[9] putc - Schreiben eines Zeichens in einer Datei\n"); printf("\t\tint putc (int zeichen, FILE *fz);\n"); printf("[10] fputc - Schreiben eines Zeichens in einer Datei\n"); printf("\t\tint fputc (int zeichen, FILE *fz);\n\n"); printf("[0] Beenden\n"); scanf("%d", &m1); switch (m1) { case 0 : printf("Programm beendet!\n"); break; case 1 : printf("Modus:\n"); printf("r - zum Lesen oeffnen\n"); printf("w - zum Schreiben oeffnen\n\t\t(neu anlegen oder Inhalt einer existierenden Datei loeschen\n"); printf("a - zum Schreiben am Dateiende oeffnen\n\t\t(nicht existierende Datei wird angelegt)\n"); printf("r+ - zum Lesen und Schreiben oeffnen\n"); printf("w+ - zum Lesen und Schreiben oeffnen\n\t\t(Inhalt einer existierenden Datei wird geloescht)\n"); printf("a+ - zum Lesen und Schreiben ab Dateiende oeffnen\n"); printf("Geben Sie den Modus ein: "); char z[] = " "; scanf ("%s", &z); warfopen(z); break; case 2 : printf("Modus:\n"); printf("r - zum Lesen oeffnen\n"); printf("w - zum Schreiben oeffnen\n\t\t(neu anlegen oder Inhalt einer existierenden Datei loeschen\n"); printf("a - zum Schreiben am Dateiende oeffnen\n\t\t(nicht existierende Datei wird angelegt)\n"); printf("r+ - zum Lesen und Schreiben oeffnen\n"); printf("w+ - zum Lesen und Schreiben oeffnen\n\t\t(Inhalt einer existierenden Datei wird geloescht)\n"); printf("a+ - zum Lesen und Schreiben ab Dateiende oeffnen\n"); printf("Geben Sie den Modus ein: "); char z1[] = " "; scanf ("%s", &z1); warfreopen(z1); break; case 3 : warfclose (); break; case 4 : warerror (); break; case 5 : warclearerr (); break; case 6 : getputchar (); break; case 7 : wargetc (); break; case 8 : warfgetc (); break; case 9 : warputc (); break; case 10: warfputc (); break; } if (m1 == 0) {break; } } exit (0); }
Wenn einer frag wozu?: Das ist ein Lernprogramm, ich hab viele von solchen.
Problem:
Ich habe bemerkt dass wenn ich für den modus ein + reinsetze b. w+, dann wird noch die funktion abgearbeitet, danach aber stürzt er ohne meldung ab?
Hab ich was falsches eingegeben? Oder falscher typ?vielen dank
-
Du kannst strings nicht mit == vergleichen. Du musst strcmp benutzen.
if ( zeich == "r" || "w" || "a" || "r+" || "w+"|| "a+") ist totaler Quatsch.
Solche Hinternanderschaltungen gehen nicht.
So muss es aussehen:
if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || .... !strcmp(zeich, "a+"))
---
scanf ("%s", &datei); ist falsch. Bei Strings kommt kein & hin.
---
char z1[] = " ";
scanf ("%s", &z1);Mach da mal sowas hin:
char z1[100];
scanf ("%s", z1);Weiter habe ich nicht geguckt.
-
wenn ich dich richtig verstanden habe, sollte das ganze so aussehen?
if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || !strcmp(zeich, "a") || !strcmp(zeich, "r+") || !strcmp(zeich, "w+") || !strcmp(zeich, "a+")) {
nun, es funktioniert nicht.
Hier mal die funktionvoid warfreopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", &datei); //if ( zeich == "r" || "w" || "a" || "r+" || "w+"|| "a+") { // falsch if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || !strcmp(zeich, "a") || !strcmp(zeich, "r+") || !strcmp(zeich, "w+") || !strcmp(zeich, "a+")) { if ( (Fd1 = freopen (datei, zeich, Fd1)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde erneut geoeffnet!\n\n"); } else printf("Falsches Zeichen!\n"); }
vielen dank für hilfe
edit: irgendwie hats jetzt funktioniert
-
habe wohl das editieren falsch gemacht, hier neu gemacht (sorry)
#include <stdio.h> #include <errno.h> #include <string.h> FILE *Fd1; void warfopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", datei); if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || !strcmp(zeich, "a") || !strcmp(zeich, "r+") || !strcmp(zeich, "w+") || !strcmp(zeich, "a+")) { if ( (Fd1 = fopen (datei, zeich)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde geoeffnet!\n\n"); } else printf("Falsches Zeichen!\n"); } void warfreopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", datei); //if ( zeich == "r" || "w" || "a" || "r+" || "w+"|| "a+") { // falsch if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || !strcmp(zeich, "a") || !strcmp(zeich, "r+") || !strcmp(zeich, "w+") || !strcmp(zeich, "a+")) { if ( (Fd1 = freopen (datei, zeich, Fd1)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde erneut geoeffnet!\n\n"); } else printf("Falsches Zeichen!\n"); } void warfclose () { if ( fclose (Fd1) ) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde geschlossen!\n"); } void warerror () { if ((stdin || stdout) != 0){ printf("Keine Datei angegeben!\n"); } else { if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { if (ferror (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein Fehler!\n"); if (feof (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein EOF!\n"); } } } void warclearerr () { if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { clearerr (Fd1); printf("Flags werden jetzt geloescht!\n"); } } void getputchar () { int zeichen; printf("Alle eingegebenen Zeichen werden gleich auf den Monitor ausgegeben!\n"); if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while ( (zeichen = getchar ()) != EOF) putchar (zeichen); } } void wargetc () { printf("Mit STRG + D beenden.\n"); int zeichen; if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while ( (zeichen = getc(Fd1) ) != EOF) putchar(zeichen); printf("Ende der Eingabe mit getc!\n"); } } void warfgetc () { printf("Mit STRG + D beenden.\n"); int zeichen; if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while ( (zeichen = fgetc(Fd1) ) != EOF) putchar (zeichen); } printf("Ende der Eingabe mit getc!\n"); } void warputc () { printf("Mit STRG + D beenden.\n"); int zeichen; printf("Geben Sie ein oder mehrere Zeichen ein:\n"); if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while ( (zeichen = getchar() ) != EOF) putc(zeichen,Fd1); printf("Ende der Eingabe mit getc!\n"); } } void warfputc () { printf("Mit STRG + D beenden.\n"); int zeichen; printf("Geben Sie ein oder mehrere Zeichen ein:\n"); if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { while ( (zeichen = getchar() ) != EOF) fputc(zeichen,Fd1); printf("Ende der Eingabe mit getc!\n"); } } int main (void) { int m1, m2; for (;;) { // m1 printf("[1] fopen - Oeffnen einer Datei.\n"); printf("\t\tFILE *fopen (const char *datei, const char *modus)\n\n"); printf("[2] freopen - Oeffnen einer Datei mit bereits existierendem Stream.\n"); printf("\t\tFILE *freopen (const char *datei, const char *modus, FILE *fz)\n\n"); // fz = File Zeiger printf("[3] fclose - Schliessen einer Datei.\n"); printf("\t\tint fclose (FILE *fz);\n\n"); printf("[4] feof/ferror - Pruefen des EOF-und Fehler-Flags\n"); printf("\t\tint feof (FILE *fz);\n\t\tint ferror (FILE *fz);\n\n"); printf("[5] clearerr - Loeschen des Fehler-und EOF-Flags\n"); printf("\t\tvoid clearerr (FILE *fz);\n\n"); printf("[6] getchar - Lesen eines Zeichen von stdin\n"); printf("\t\tint getchar (void);\n"); printf(" putchar - Schreiben eines Zeichen auf stdout\n"); printf("\t\tint putchar (int zeichen);\n\n"); printf("[7] getc - Lesen eines Zeichens aus einer Datei\n"); printf("\t\tint getc (FILE *fz);\n"); printf("[8] fgetc - Lesen eines Zeichens aus einer Datei\n"); printf("\t\tint fgetc (FILE *fz)\n\n"); printf("[9] putc - Schreiben eines Zeichens in einer Datei\n"); printf("\t\tint putc (int zeichen, FILE *fz);\n"); printf("[10] fputc - Schreiben eines Zeichens in einer Datei\n"); printf("\t\tint fputc (int zeichen, FILE *fz);\n\n"); printf("[0] Beenden\n"); scanf("%d", &m1); switch (m1) { case 0 : printf("Programm beendet!\n"); break; case 1 : printf("Modus:\n"); printf("r - zum Lesen oeffnen\n"); printf("w - zum Schreiben oeffnen\n\t\t(neu anlegen oder Inhalt einer existierenden Datei loeschen\n"); printf("a - zum Schreiben am Dateiende oeffnen\n\t\t(nicht existierende Datei wird angelegt)\n"); printf("r+ - zum Lesen und Schreiben oeffnen\n"); printf("w+ - zum Lesen und Schreiben oeffnen\n\t\t(Inhalt einer existierenden Datei wird geloescht)\n"); printf("a+ - zum Lesen und Schreiben ab Dateiende oeffnen\n"); printf("Geben Sie den Modus ein: "); char z[10]; scanf ("%s", z); warfopen(z); break; case 2 : printf("Modus:\n"); printf("r - zum Lesen oeffnen\n"); printf("w - zum Schreiben oeffnen\n\t\t(neu anlegen oder Inhalt einer existierenden Datei loeschen\n"); printf("a - zum Schreiben am Dateiende oeffnen\n\t\t(nicht existierende Datei wird angelegt)\n"); printf("r+ - zum Lesen und Schreiben oeffnen\n"); printf("w+ - zum Lesen und Schreiben oeffnen\n\t\t(Inhalt einer existierenden Datei wird geloescht)\n"); printf("a+ - zum Lesen und Schreiben ab Dateiende oeffnen\n"); printf("Geben Sie den Modus ein: "); char z1[10]; scanf ("%s", z1); warfreopen(z1); break; case 3 : warfclose (); break; case 4 : warerror (); break; case 5 : warclearerr (); break; case 6 : getputchar (); break; case 7 : wargetc (); break; case 8 : warfgetc (); break; case 9 : warputc (); break; case 10: warfputc (); break; } if (m1 == 0) {break; } } exit (0); }
-
Eine "interessante" Klammerung hat du
Noch was, du brauchst deine main Funktion nicht mit exit(0) zu beenden, wenn die beendet ist, ist das Programm eh beendet, also reicht return 0
-
stimmt, nur ich habs vom systemprogrammierbuch deshalb habe ich exit benutzt
edit: wie ? interessante?
-
maximo schrieb:
#include <stdio.h> #include <errno.h> #include <string.h> FILE *Fd1; void warfopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", datei); if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || !strcmp(zeich, "a") || !strcmp(zeich, "r+") || !strcmp(zeich, "w+") || !strcmp(zeich, "a+")) { if ( (Fd1 = fopen (datei, zeich)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde geoeffnet!\n\n"); } else printf("Falsches Zeichen!\n"); } /* ......... */ void warerror () { if ((stdin || stdout) != 0){ printf("Keine Datei angegeben!\n"); } else { if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { if (ferror (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein Fehler!\n"); if (feof (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein EOF!\n"); } } }
Es hilft der Lesbarkeit, wenn man die Schliessenden Klammern auf eine neue Zeile schreibt. Dann erkennt man schneller wo ein Block (if, Schleife, Funktion) endet.
#include <stdio.h> #include <errno.h> #include <string.h> FILE *Fd1; void warfopen (char zeich[]) { //FILE *Fd1; char datei[20]; printf("Geben Sie die Datei ein: "); scanf ("%s", datei); if(!strcmp(zeich, "r") || !strcmp(zeich, "w") || !strcmp(zeich, "a") || !strcmp(zeich, "r+") || !strcmp(zeich, "w+") || !strcmp(zeich, "a+")) { //Beginn if-Block if ( (Fd1 = fopen (datei, zeich)) == NULL) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Datei wurde geoeffnet!\n\n"); } // hier endet der if-Block else printf("Falsches Zeichen!\n"); } // Sieht sofort, das hier die Funktion endet /* ...... */ void warerror () { if ((stdin || stdout) != 0){ printf("Keine Datei angegeben!\n"); } else { if (Fd1 == NULL){ printf("Keine Datei!\n"); } else { if (ferror (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein Fehler!\n"); if (feof (Fd1)) fprintf(stderr, "Fehler: %s\n\n", strerror (errno)); else printf("Kein EOF!\n"); } } }
Es sieht erstens besser aus und hilft anderen Leuten und evtl. dir selbst später sich schnell in deinem Code zurecht zufinden.
-
recht hast schon, nur ich will mir schon das angewöhnen und ich finde wer C lernen will sollte als voraussetzung bisschen mehr hirn mitbringen und konzentriert sein, wenn man ein code lesen. Ausserdem andere machen es auch.
Und ich mach auch abstände dass man auch es sofort sieht wo es endet.
Und der code ist lange nicht fertig, wenn er fertig ist mach ich dann die kosmetischen sachen wie einrücken usw.
-
Viel Erfolg bei deinem Programm.
-
vielen dank und ich hoffe auf eure hilfe
OT: alle meine programme werden auf meiner seite veröffentlicht
-
imhotep schrieb:
Viel Erfolg bei deinem Programm.
Wünsche ich auch. Alles Gute.