C Text Datei erstellen
-
Hallo Leute,
ich möchte ein Programm schreiben welches eine Text Datei erstellt mit dem Inhalt den man vorher eingegeben hat füllt.Mein Code ist:
#include <stdio.h> #include <stdlib.h> int wahl; char text[]; FILE *Datei; void TextDatei_erzeugen(); int main(int argc, char** argv) { printf(" Auswahl Men\x81 "); printf("\n"); printf(" ---------- "); printf("\n\n"); printf(" 1: Erstellen einer Text Datei"); printf("\n"); printf(" 2: Beenden"); printf("\n\n"); printf(" Ihre Auswahl: "); scanf("%d",&wahl); switch(wahl) { case 1: TextDatei_erzeugen(); break; case 2: printf("case2"); break; default: printf("nix"); } return (EXIT_SUCCESS); } void TextDatei_erzeugen() { printf("Bitte geben Sie den Text ein: "); Datei = fopen ("asd.txt", "w"); fgets ( text, 2, stdin ); Datei,("%s", &text); fclose (Datei); }
Mein Problem ist, es wird zwar eine Text Datei erstellt, die aber leer ist. Wo könnte der fehler sein hab schon vieles ausprobiert.
-
trixx_128 schrieb:
fgets ( text, 2, stdin ); Datei,("%s", &text);
Ist das ein Abtippfehler?
Schreiben kann man ähnlich, wie du gelesen hast:
char buf[256]; fgets (buf, sizeof(buf)/sizeof(buf[0]), stdin); fputs (buf, Datei);
Ich möchte dich bitten, auf globale Variablen zu verzichten, die machen mir diese kleine Aufgabe unübersichtlich und dir bei einem grossen Projekt das Leben schwer.
-
Was meinst du denn mit Abtippfehler genau?
-
Manche Spezialisten tippen die ganze Datei ab und bauen damit unbewusst einen Fehler rein und/oder beseitigen den genannten.
Die Zeile
Datei,("%s", &text);
sieht für mich nach so was aus.
Vielleicht hat dir aber auch nur derfputs
-Befehl gefehlt und darum hast du so einen komischen Ausdruck hingeschrieben.
-
Komischerweise funktioniert es ohne die switch case anweisung. Sobald ich mit switch und case arbeite geht es nicht, die textdatei bleibt leer.
-
Du solltest deinem Text auch Platz zum ablegen gönnen.
char text[];
reserviert für 0 Zeichen Platz.
Für deine Zwecke sollte einchar text[1000];
reichen
-
hab ma deine TextDatei_erzeugen()-Funktion umgeschrieben.
bei mir funktionierts (unter Dev-C++ & msvc++ 2008) so:void TextDatei_erzeugen() { printf("Bitte geben Sie den Text ein: "); Datei = fopen ("asd.txt", "w"); scanf("%s", &text); fputs ( text, Datei); fclose (Datei); }
-
So funktioniert es wunderbar aber bis zum ersten Leerzeichen. Wenn ich zum Beispiel Hallo wie geht es dir eintippe speichert er nur Hallo ab.
Muss ich nicht fget benutzen ( ist ja für strings gedacht), oder muss ich da mit arrays arbeiten damit ich auch nach dem Leerzeichen speichern kann.
-
trixx_128 schrieb:
So funktioniert es wunderbar aber bis zum ersten Leerzeichen.
So ist das Verhalten von
scanf("%s", text); //ACHTUNG das & muss weg
definiert.
Warum bist du nicht bei fgets geblieben?
Dann aber mehr als 2 Zeichenfgets (text, 999), stdin); // Wenn char text[1000];
Und du arbeitest bereits mit Arrays.
-
Wäre mal ein Grund, C++ einzusetzen:
ofstream datei; // Ausgabestream festlegen char text[20]; ... datei.open("xxxx.TXT"); // Datei öffnen ... fgets(text,10,stdin); // Text holen ... datei << "gewählt: " << text << endl; // irgendwas in die Datei schreiben ... datei.cose(); // Datei schliessen
Alles weitere kann ja in reinem C bleiben. Man gewinnt aber schnell Spass an C++ und nutzt bald mehr, z.B. CIN und COUT für die Standardeingabe und -ausgabe.
-
Wenn schon C++, dann doch bitte richtig:
char text[20]; ... ofstream datei("xxxx.TXT"); // Ausgabestream festlegen und gleich Datei öffnen ... fgets(text,10,stdin); // Text holen ... datei << "gewählt: " << text << '\n'; // irgendwas in die Datei schreiben und danach NICHT flushen ... } // Datei wird automatisch geschlossen
-
So nun habe ich es, es liegt daran das scanf in den input buffer ein <enter> noch setzt.
wenn fgets aufgerufen wird sieht er es und ist damit zufrieden,die Textdatei bleibt leer.
bevor man fgets wieder verwenden kann muss man den <stdin> buffer löschen.
fscanf(stdin,"%d", &wahl); .... fflush(stdin); .... fgets ( text, 100, stdin );
-
@SeppJ: Gut, kann man in C++ so machen wie du schreibst. Völlig falsch war mein Hinweis aber nicht. Z.B. dann, wenn während der Laufzeit erst der Dateiname festgelegt werden soll, ein und derselbe ofstream nacheinander mehrere Dateien erstellen soll, und und und. Bleibt nur << endl oder << ´\n´ worüber man reden kann. Aber der Fragesteller hatte eine C-Lösung gesucht. C++ war da nur ein kleiner lohnender Ausflug. So oder so ähnlich sind seinerzeit wohl alle C-Programmierer mit kleinen Schritten von C nach C++ umgestiegen. Auch ist es guter Stil, Systemresourcen selbst zu schliessen sobald man sie nicht mehr benötigt und das gilt genauso in C wie in C++.
Frohe Weihnachten - Feliz Navidad :xmas1:
-
trixx_128 schrieb:
fscanf(stdin,"%d", &wahl); .... fflush(stdin); .... fgets ( text, 100, stdin );
Schrott und nicht standardkonform. Du bist in die mittlerweile Top-Anfängerfalle gelaufen. Den Eingabepuffer löscht man standardkonform und nicht so wie du (und leider 99% aller Anfänger hier).
-
Natürlich bin ich ein Anfänger, und warum meinst du frag ich nach einen Tipp in diesem Forum.
Wenn du so schlau bist dann mach mal es richtig, und beweis das du nicht nur labbern kannst.
-
Auch wenn Wutz scheinbar dauergenervt ist (nichts für ungut :xmas1: ) hat er recht. Alternative wäre:
int c; while ((c = getchar()) != EOF && c != '\n');
Das Verhalten von fflush() auf input streams ist nicht definiert und somit ist fflush(stdin) nicht standardkonform.
-
Danke für deine Freundliche antwort werde es mir angucken und verändern. Ich kann solche leute nicht ausstehen, wenn er meint das er was besseres ist soll er hier nicht schreiben.
-
trixx_128 schrieb:
Danke für deine Freundliche antwort werde es mir angucken und verändern. Ich kann solche leute nicht ausstehen, wenn er meint das er was besseres ist soll er hier nicht schreiben.
In einem Forum wie diesem wird selbstverständlich auch Anfängern geholfen. Ist doch klar! Nur sollte auch ein Anfänger im Diskussionsstil nicht dieselben Patzer machen, die er bei anderen vielleicht zu recht bekritelt.