Datei einlesen, rückwärts ausgeben



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int a=0;
    
    void umdrehen(FILE* eingabe, FILE* ausgabe)
    {
    	fseek(eingabe, 0L, SEEK_END); //File-Pointer wird ans Ende der Datei gesetzt
    	long filepos = ftell(eingabe); //Dateiition wird festgestellt
    	while (filepos >= 0) //So lange die Dateiposition grösser ist als 0 wird die Schleife ausgeführt
    	{
    	fseek(eingabe, filepos, SEEK_SET); //File-Pointer wird an den Anfang der Datei gesetzt
    	if(a==1)putc(getc(eingabe), stdout); //Buchstaben ausgeben
    	if(a==0)fputc(getc(eingabe), ausgabe);
    	filepos -= 1; //eine Position rückwärts gehen
    	}
    	getchar();
    
    }
    
    void chomp(char *str) {
       size_t p=strlen(str);
       /* '\n' mit '\0' überschreiben */
       str[p-1]='\0';
    }
    
    int main()
    {
    
    	FILE* quelldatei;
    	FILE* zieldatei;
    	char source[20];
    	char destination[20];
    	fputs("Bitte Dateinamen eingeben, zuerst Quellen, dann Zielverzeichnis. Enter, wenn kein Zielverzeichnis gewollt. \n",stdout);
    	fgets(source, sizeof source, stdin);
    	fgets(destination, sizeof destination, stdin);
    	if(*source=='\n'){
    		fputs("Ungültiges Quellenverzeichnis, beende...\n",stdout);return EXIT_FAILURE;
    	}
    	if(*destination=='\n'){
    		fputs("Ungültiges Zielverzeichnis, Ausgabe erfolgt hier...\n",stdout);a=1;
    	}
    	chomp(source);
    	chomp(destination);
    	if((quelldatei=fopen(source,"r")) == NULL) // Datei wird geöffnet
    	{
    	fprintf(stderr,"Konnte %s nicht oeffnen\n",source); // Fehlermeldung falls Datei nicht geöffnet werden kann
    	getchar();
    	return EXIT_FAILURE;
    	};
    	if((zieldatei=fopen(destination,"w")) == NULL) // Datei wird geöffnet
    	{
    	fprintf(stderr,"Konnte %s nicht oeffnen\n",zieldatei); // Fehlermeldung falls Datei nicht geöffnet werden kann
    	getchar();
    	return EXIT_FAILURE;
    	};														//Damit wurde überprüft, ob die normalen Argumente übergeben worden sind UND ob die Dateien überhaupt existieren.
    	umdrehen(quelldatei,zieldatei);
    
    }
    

    Das ist mein Code. Mit scanf würde es funktionieren, allerdings will ich auf enter überprüfen und bekomme das nicht mit fgets auf die Reihe. Wo liegt das Problem?!
    Mit scanf hatte ich allerdings in nem Testdurchlauf, dass er mir ne neue Textdatei angelegt hat, ohne zu überprüfen, ob es die gibt, in die ich eig. reinschreiben will.
    Wär nett, wenn mal jmd. drüber gucken würde. 🙂


  • Mod

    Also kurz gesagt: Dein eigentliches Problem ist nicht das Umdrehen der Datei. Noch ist es im speziellen ein Problem mit fgets. Sondern es geht darum, zu überprüfen, ob ein Nutzer eine leere Eingabe gemacht hat? Das hättest du auch direkt fragen können, ohne den Leser erst auf falsche Fährten zu locken.

    Dazu gibt es viele Lösungen. Unter der Annahme, dass die Dateinamen keine Zeilenumbrüche enthalten dürfen¹:

    #include <stdio.h>
    
    int main()
    {
      char filename[2001];
      scanf("%2000[^\n]", filename); 
      if(filename[0] == 0)
        puts("Leer");
      else
        puts("Nicht leer");
      return 0;
    }
    

    Allgemeiner Tipp: Lass die globalen Variablen sein! Du hast doch bereits einen FILE* als Parameter der Funktion, der das Ziel der Ausgabe steuert. Übergib der Funktion doch stdout als Ziel, wenn du eine Ausgabe dorthin wünscht!

    ¹: Dies passt zu deiner Benutzerführung, aber an sich sehe ich keinen Grund, wieso du dich in dieser Hinsicht unbedingt einschränken musst



  • Nicht direkt, ich HÄTTE es bloß viel lieber mit fgets gemacht 😃 .
    Und ich kann nicht nachvollziehen, warum der die Dateien dann nicht öffnen kann (eig. müsste doch das '\n' removed werden?!).
    Ich weiß, globale Variablen sind böse, genauso wie goto. ^^
    Ich werd's aendern.


  • Mod

    Mit fgets geht es auch nicht groß anders:

    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
      char filename[2001];
      fgets(filename, sizeof filename, stdin);
      if(filename[0] == '\n')
        puts("Leer");
      else
        {
          filename[strlen(filename)-1] = '\0';  // Besser wäre, erst zu prüfen, ob da auch ein '\n' steht, aber dies ist bloß ein schnelles Beispiel.
          puts(filename);
        }
      return 0;
    }
    

    Master450 schrieb:

    Und ich kann nicht nachvollziehen, warum der die Dateien dann nicht öffnen kann (eig. müsste doch das '\n' removed werden?!).

    Das klingt eher nach einem anderen Problem. Beschreib mal genauer, was du machst, was du erwartest, und was stattdessen passiert.



  • Ok, du hast Recht.
    Das Programm soll vom User eine Datei übergeben bekommen, optional 2.
    Wenn nur 1: Dann soll die Datei rückwärts in der Konsole ausgegeben werden.
    Wenn 2: Dann soll die Datei rückwärts in eine andere Textdatei ausgegeben werden.
    Problem: Jetzt scheitert es beim Öffnen, obwohl das zwischendurch mal funktioniert hat 😕 . Ich bekomm immer "konnte (null) nicht öffnen".
    Edit: Nvm, ich bin dämlich XD. Ist ja egal, ob ich nichts eingebe oder etwas beim Optionalen, der versucht ja immer die Zieldatei zu öffnen.

    Edit:2 Nvm², ich bekomm auch keine Rückmeldung, wenn die Datei ungültig ist(sprich enter eingegeben wird), aber nur bei der zieldatei .

    Edit 3: Ich editiere zu viel. Also das mit dem Öffnen hab ich gefixed, da war einfach ein Zeichenfehler, den ich übersehen habe. Das Problem ist jetzt, statt zu überprüfen, ob die Datei, in die geschrieben wird, überhaupt existiert legt er einfach ne neue an. Das liegt aber daran, dass ich "w" nutze und er ja dann einfach ne neue Datei anlegt. Ich würde jetzt einfach vorher nochmal auf "r" prüfen, gibts noch ne elegantere Lösung?

    ...Uuund ich habs gefixed. Geht jetzt alles. Poste nachher noch den kompletten Code hier rein, muss jetzt zum Bus.


Anmelden zum Antworten