C mehrere Zeilen einlesen und in Datei schreiben

yax

Erfahrenes Mitglied
Hallo :),

also, ich habe folgendes Problem, ich möchte eine Art Texteditor schreiben, doch ich schaff es einfach nicht mehrere Zeilen von der Konsole einzulesen und diese dann in eine Datei zu schreiben. Ich schaffe immer nur eine Zeile :/

Code:
Code:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

void starteEditor() {
     system("cls");
     
     FILE *fp;
     char name[1000];
     char text[1000];

     printf("Willkommen im Text Editor. :) Wie soll die Datei heissen: ");
     scanf("%s", name);

     fp = fopen(name, "w+");
     
     printf("Was moechten sie in die Datei %s schreiben:\n\n", name); 
     fflush(stdin);
     gets(text);
               
     
     fprintf(fp, text);
     printf("Die Datei %s wurde erfolgreich gespeichert.\n\n", name);
}

Hat jemand eine Idee was ich machen kann?

Gruß yax :)
 
Hi

Zum Beispiel eine Schleife?

Du musst halt irgendwie feststellen, wann der Benutzer fertig ist und nichts mehr eingeben will.

Weitere Verbesserungsvorschläge:
Statt gets fgets nehmen, wegen der Maximallängenbeschränkung.
Beim fopen danach prüfen, ob es auch wirklich geklappt hat.
Strings, die eventuell Leerzeichen drin haben, nicht mit %s ausgeben.
Es gibt auch fputs für die Datei, statt fprintf.
Kein fflush(stdin)! Überhaupt kein fflush auf Eingabezeug!

Gruß
 
So, ich hab es jetzt geschafft mehrere Zeilen einzulesen aber ich schaff es einfach nicht diese in die Datei zu schreiben. Könnt ihr mir vielleicht helfen ?

Code:
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ZEILENLAENGE 80

int startText(void) {
    system("cls");
    char text[1000];
    char name[1000];
    
    printf("Wie soll die Datei heissen: ");
    scanf("%s", &name);
    FILE *fp;
    if((fp = fopen(name, "w+")) == NULL) {
      printf("Es ist ein Fehler aufgetreten\n!");
      return EXIT_FAILURE;
    }
    
    printf("Was moechten sie reinschreiben: ");
    while(fgets(text,ZEILENLAENGE,stdin)) {
      scanf("%s", text);
      fprintf(fp,"%s",text);
   }
      
      
          
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Hi

Beim scanf für den Dateinamen sollte das & beim name weg.
Überhaupt solltest du besser fgets verwenden. scanf("%s") liest nur bis zum ersten Leerzeichen ein (falls eines drin ist). Ein Dateiname kann auch Leerzeichen haben, also besser fgets.

Beim fopen reicht statt "w+" auch ein einfaches w oder a.

Beim "Was möchten sie reinschreiben": Warum machst du zuerst ein fgets auf stdin und dann ein scanf("%s")?
Das fgets reicht allein auch.

Statt dem fprintf könntest du auch fputs verwenden, wenn du schon fgets hast...

Und (Wahrscheinlich) der Grund, warum bei dir am Ende nichts in der Datei ist: Du musst die Datei auch wieder schließen.
Zu jedem fopen auch ein fclose, hier am besten vor dem system("pause").

Das System-Pause könntest du übrigens auch durch ein fgetc(stdin) (oder etwas in der Art) ersetzen, dann bist du nicht von einem anderen Programm abhängig.
Wenn du auch eine Meldung a la "Press any key to continue" willst, machst du eben nch ein printf dazu...

Gruß
 
Kommt darauf an, wann du es stoppen willst?
Eine Idee wäre zB wenn der Benutzer eine Leerzeile eingibt (bzw. nach einem Enter ohne irgendeinen Buchstaben nocheinmal Enter drückt).

Als Bedingung hast du dann, ob strlen(...) 0 ist.
 
Aber wenn ich jetzt

Code:
if((strlen(text)) == 0)
        break;
eingebe, passiert gar nichts.

Und wenn ich anstatt 0 eine 1 angebe kann ich gar nicht erst schreiben. Was ist das Problem?
 
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ZEILENLAENGE 80

int startText(void) {
    system("cls");
    char text[1000];
    char name[1000];
    
    printf("Wie soll die Datei heissen: ");
    scanf("%s",name);
    FILE *fp;
    if((fp = fopen(name, "w")) == NULL) {
      printf("Es ist ein Fehler aufgetreten\n!");
      return EXIT_FAILURE;
    }
    
    printf("Was moechten sie reinschreiben: ");
    while(fgets(text,ZEILENLAENGE,stdin)) {
      fputs(text,fp);
      if((strlen(text)) == 0)
        break;
    }
      
      
    fclose(fp);      
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Hallo,

schau dich am besten mal nach einer C-Referenz um. Darin würde z.B. stehen, dass fgets das Zeilenumbruch-Zeichen mit abspeichert, also nie ein String der Länge 0 rauskommen kann. Du könntest stattdessen z.B. einfach testen, ob das erste Zeichen ein '\n' ist. Aber Vorsicht: scanf belässt beim Einlesen das Zeilenumbruch-Zeichen im Eingabestrom. Der nächste Aufruf von fgets würde also eine leere Zeile „sehen“ und dein Programm würde sofort beendet werden. Verwende also besser auch beim Einlesen des Dateinamens fgets anstatt scanf (wie sheel ja schon vorgeschlagen hatte).

Grüße,
Matthias
 
Zurück