Arbeit mit Datei funktioniert nicht



  • hallo,

    ich habe folgendes programm geschrieben:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        if(argc!=2)
        {
            printf("fehler1\n");
            exit(1);
        }
        FILE *fp;
        char c;
        fp=fopen(argv[1],"r+");
        if(fp==NULL)
        {
            printf("fehler2\n");
            exit(1);
        }
        while((c=fgetc(fp))!=EOF)
        {
            fputc('a',fp);
        }
        fclose(fp);
        return 0;
    }
    

    das programm soll die datei, die über die kommandozeile übergeben wird, öffnen und jedes zeichen mit 'a' ersetzen.

    warum funktioniert das ganz nicht richtig?



  • anfänger - gast schrieb:

    warum funktioniert das ganz nicht richtig?

    Wirklich tolle Fehlerbeschreibung. 🙄
    Was macht es denn genau?

    Es gibt nur einen Schreib-/Lesezeiger für die Datei. Und der wird bei jedem schreiben/lesen weitergesetzt. (Nein, das ist nicht dein fp)

    Wenn du das erste Zeichen gelesen hast, steht er auf dem zweiten Zeichen.
    Das überschreibst du mit 'a'. Dadurch steht der Zeiger auf dem dritten Zeichen.
    ....



  • - c muss hier vom Typ int sein
    - "r+b" wäre hier besser als "r+"
    - im Update-Modus von fopen-Streams muss zw. einer Leseaktion und einer direkt folgenden Schreibaktion (und umgekehrt) eine explizite Stream-Positionierung bzw. fflush erfolgen, das fehlt alles bei dir



  • @DirkB: nachdem ich das programm ausgeführt hab (und eine datei über die kommandozeile übergeben habe) ist die datei am ende leer.

    @Wutz:
    danke, aber ich hab das jetzt alles ausgebessert, und es funktioniert immer noch nicht:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        if(argc!=2)
        {
            printf("fehler1\n");
            exit(1);
        }
        FILE *fp;
        int c; //int statt char
        fp=fopen(argv[1],"r+b"); //"r+b" statt "r+"
        if(fp==NULL)
        {
            printf("fehler2\n");
            exit(1);
        }
        while((c=fgetc(fp))!=EOF)
        {
            fputc('a',fp);
            fflush(fp); //fflush() hinzugefügt
        }
        fclose(fp);
        return 0;
    }
    

    alles wie vorher, die datei ist am ende leer.



  • Wo ist die Streampositionierung zw. Lese- und Schreibaktion?



  • meinst du streampositioniertung mit fseek?


Anmelden zum Antworten