zeilen rückwärts ausgeben und in andere Datei kopieren



  • Hallo Zusammen,

    Das Programm soll mit zwei Funktionen laufen: der reverse funktion(für das umkehren) und einer funktion die eine Datei öffnet, die einzelnen Zeilen umkehrt, diese in die Zieldatei kopiert und anschließend wieder schließt.
    Das Hauptprogramm soll die zweite Funktion aufrufen und nur nach den Dateinamen fragen.

    Im Moment sieht mein Programm noch so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void reverse(char line[])
    {
        int  i;
        int  length;
        char temp;
        if (line == NULL)
            return;
        length = strlen(line);
        for (i = 0 ; i < length / 2 + length % 2 ; ++i)
        {
            if (line[i] == line[length - i - 1])
                continue;
            temp                 = line[i];
            line[i]              = line[length - i - 1];
            line[length - i - 1] = temp;
        }
        return;
    }
    
    int main()
    {
    
        FILE *src_fh, *dst_fh;
        char src_fn[256+1], dst_fn[256+1];
    
        printf("Enter Source File Name:\n");
        fgets(src_fn, sizeof(src_fn), stdin); reverse(src_fn);
    
        if( (src_fh = fopen(src_fn, "r")) == NULL )
        {
            printf("ERROR: Source File %s Failed To Open...\n",src_fn);
            return(-1);
        }
    
        printf("Enter Destination File Name:\n");
        fgets(dst_fn, sizeof(dst_fn), stdin); reverse(dst_fn);
    
        if( (dst_fh = fopen(dst_fn, "w+")) == NULL )
        {
            fclose(src_fh);
            printf("ERROR: Destination File %s Failed To Open...\n",dst_fn);
            return(-2);
        }
    
        int ch;
        while( (ch = fgetc(src_fh)) != EOF )
        {
            fputc(ch, dst_fh);
        }
    
        fclose(src_fh);
        fclose(dst_fh);
        return 0;
    }
    

    Wie bekomme ich da die zweite Funktion heraus. Im Prinzip steht dann doch das was jetzt im main programm steht, in meiner zweiten Funktion?
    Ich weiß nur nicht wie ich das Ganze angehen soll.



  • Beide Funktionen sollen die Zeile umkehren? Du schreibst doch jetzt die Zeichen
    genau wieder in der gleichen Reihenfolge wir du sie gelesen hast in die Datei.



  • Nein, die zeilen in der zieldatei sollen natürlich nicht nochmal umgekehrt werden, das muss noch geändert werden. Die zweite Funktion soll auf die reverse Funktion zugreifen, das heißt die zweite Funktion macht die tatsächliche Arbeit.



  • Dann verfrachte den Code aus der main bis auf die Abfrage des Namens in die 2.
    Funktion. Wenn du die Zeile umkehren willst, dann lies die Datei Zeilenweise mit fgets aus und übergib reserve das Resultat. Dann schreibst du die Zeile in
    die neue Datei



  • Ok, aber wie rufe ich die zweite Funktion korrekt in dem Hauptprogramm auf.
    So stimmt es ja wahrscheinlich nicht:

    #include<stdio.h>
    #include<string.h>
    
    void reverse(char line[])
    {
        int  i;
        int  length;
        char temp;
        if (line == NULL)
            return;
        length = strlen(line);
        for (i = 0 ; i < length / 2 + length % 2 ; ++i)
        {
            if (line[i] == line[length - i - 1])
                continue;
            temp                 = line[i];
            line[i]              = line[length - i - 1];
            line[length - i - 1] = temp;
        }
        return;
    }
    
    char copying(src_file, dst_file);
    
        FILE *src_file, *dst_file; 
        char src_file[200], dst_file[200];
    
        fgets(src_file, sizeof(src_file), stdin); reverse(src_file); 
    
        if( (src_file = fopen(src_file, "r")) == NULL ) 
        { 
            printf("ERROR: Source File %s Failed To Open...\n",src_file); 
            return(-1); 
        } 
    
        fgets(dst_fn, sizeof(dst_fn), stdin);
    
        if( (dst_file = fopen(dst_file, "w+")) == NULL ) 
        { 
            fclose(src_file); 
            printf("ERROR: Destination File %s Failed To Open...\n",dst_file); 
            return(-2); 
        } 
    
        int ch; 
        while( (ch = fgetc(src_file)) != EOF ) 
        { 
            fputc(ch, dst_file); 
        } 
    
        fclose(src_file);  
        fclose(dst_file);
    
        return dst_file;
    
    int main() 
    { 
        printf("Enter Source File Name:\n"); 
        fgets(src_file, sizeof(src_file), stdin);
    
        printf("Enter Destination File Name:\n"); 
        fgets(dst_file, sizeof(dst_file), stdin);
    
        *dst_file = copying(src_file, dst_file); 
    
        return 0; 
    }
    


  • Ich habe mir das mal genauer angesehen und sorry, eigentlich ist der komplette Code schrott.
    Wieso fgetc und fputc wenn du die Zeilen umdrehen willst?
    Copying hat keinen Funktionsblock und return funktioniert so wie du's willst auch nicht.
    Die Namen der Variablen musst du ändern 1. Es ist unübersichtlich und 2. Jeden Namen nur ein mal verwenden.
    Zudem hast du viele Klammern falsch gesetzt (9 Fehler beim Kompilieren) und die Warnungen solltest du auch beachten.
    Du kannst von Glück reden wenn Wutz das nicht sieht 😃



  • Das Programm habe ich nochmals umgestellt.
    Der Compiler gibt mir aber die Info:

    prog.c: In function ‘copy_file’:
    prog.c:33:2: error: implicit declaration of function ‘fopen_s’ [-Werror=implicit-function-declaration]
      err = fopen_s(&ptr_old, old_filename, "rb");
      ^
    prog.c: In function ‘main’:
    prog.c:67:2: error: implicit declaration of function ‘gets_s’ [-Werror=implicit-function-declaration]
      gets_s(filename_src, 100);
    

    Kann man den Fehler beheben oder ist meine komplette copy-funktion Schrott?

    #include<stdio.h>
    #include<string.h>
    
    void reverse(char line[])
    {
        int  i;
        int  length;
        char temp;
        if (line == NULL)
            return;
        length = strlen(line);
        for (i = 0 ; i < length / 2 + length % 2 ; ++i)
        {
            if (line[i] == line[length - i - 1])
                continue;
            temp                 = line[i];
            line[i]              = line[length - i - 1];
            line[length - i - 1] = temp;
        }
        return;
    }
    
    int copy_file(char *old_filename, char  *new_filename)
    	{
    	FILE  *ptr_old, *ptr_new;
    	typedef int errno_t;
    	errno_t err = 0, err1 = 0;
    	int  a;
    
    	err = fopen_s(&ptr_old, old_filename, "rb");
    	err1 = fopen_s(&ptr_new, new_filename, "wb");
    
    	if(err != 0)
    		return  -1;
    
    	if(err1 != 0)
    	{
    		fclose(ptr_old);
    		return  -1;
    	}
    
    	while(1)
    	{
    		a  =  fgetc(ptr_old);
    
    		reverse(old_filename);
    
    		if(!feof(ptr_old))
    			fputc(a, ptr_new);
    		else
    			break;
    	}
    
    	fclose(ptr_new);
    	fclose(ptr_old);
    	return  0;
    	}
    
    int  main(void)
    {
    	char  filename_src[101], filename_dest[101];
    
    	printf("\nSource file: ");
    	gets_s(filename_src, 100);
    
    	printf("\nDestination filename: ");
    	gets_s(filename_dest, 100);
    
    	if(copy_file(filename_src, filename_dest) == 0)
    			printf("Copy Successful\n");
    	else
    			fprintf(stderr, "Error during copy!");
    }
    


  • gets_s und fopen_s sind dem Compiler nicht bekannt. (wo hast du das her? Mach es doch nicht noch umständlicher)
    1. Du fragst in der main Funktion nach den Dateinamen.
    2. Du rufst die copy_file Funktion auf und liest die Datei Zeilenweise! aus mit fgets.
    3. Du rufst die reverse Funktion auf und übergibst ihr die mit fgets gelesene Zeile.
    4. Du schreibst die fertige Zeile in die neue Datei.
    Mehr ist es nicht, entferne den unnötigen Rest aus dem Code. (vor allem jegliche fputc und fgetc)



  • Du weißt überhaupt nicht, was du tust.
    Beide Funktionen hast du dir irgendwo zusammengesucht, und weißt jetzt nicht, wie du die verwenden sollst.
    Du bist ein typischer Vertreter der Generation Google, sich dort was zusammensuchen, dabei max. die ersten 3 Treffer der (ungenauen) Suchanfrage angucken, das abschreiben, irgendwie compilierbar machen und dann rumjammern, warum das nicht läuft.
    Das kannst du in Java oder C++ versuchen, aber nicht in C.

    Du verwendest fopen_s+gets_s (C11+MS specific), ohne einen C11 Compiler zu benutzen, du redefinierst errno_t (C11 Standard), absolut Tabu.
    Du verwendest "wb"/"rb"-Streams für Strings, du ignorierst die dir hier gegebenen Hinweise zum Lesen von Strings und verwendest weiterhin dein zeichenweises Arbeiten fgetc+fputc:

    ich empfehle dir: vergiss C, nimm Java oder C++ und verschone uns hier mit deinen zum Troll grenzwertigen Anfragen.



  • ein.neuling schrieb:

    for (i = 0 ; i < length / 2 + length % 2 ; ++i)
    

    Als Auditor würde ich dich fragen: Was macht denn diese Schleife?
    Was wäre deine Antwort?



  • Tut mir Leid, wenn ich hier arrogant rüberkomme.
    C Programmieren hab ich als Pflichtfach(Maschinenbau).
    Ich komme schon wegen Überschneidungen nur selten in Vorlesungen.
    Bis jetzt hatte ich einfach nicht die Zeit mich richtig damit auseinanderzusetzen.
    Ich versuche immer nur einen gegebenen Code verstehen und erklären zu können.
    Ich verstehe schon, dass das nicht das Wahre ist, ich möchte einfach nur das Fach bestehen.



  • Aber wenn du diese (einfache) Aufgabe trotz Hilfe nicht hinbekommst, dann wird es höchste Zeit sich mit dem Thema auseinanderzusetzen.
    Programmieren ist etwas, was man sich auch problemlos alleine aneignen kann.
    Einen fertigen Code im Internet rauszusuchen wird nicht funktionieren, weil du ihn nicht verstehst und so eventuelle Fehler nicht beheben kannst. Und wenn du möchtest, dass dir jemand den fertigen Code liefert,
    dann gibts hier auch eine Rubrik dafür (natürlich gegen eine Bezahlung)



  • Man kann nicht einfach wahllos +/% rausshauen ohne es zu verstehen.
    So besteht man keine Prüfung.


Log in to reply