(Systemcalls) Mit lseek, eine Datei vom Dateiende um 20 chars vergrößern

Sekiro24

Mitglied
Es soll per lseek die Datei um 20 chars vergrößert werden und am neuen Ende soll dann das 3 Argument in die Datei geschrieben werden. Also Programmname dann Dateiname und dann der Text als 3. Argument.

Hierzu habe ich folgendes geschrieben:

C:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    int fd;
    char BUF_FILE[100], BUF_TEXT[100], BUF_OUT[100];
    char gap[] = {"^@^"};
    //Eingabe: Programmname [Datei][Text]
    if(argc < 3)
    {
        printf("Zu wenig Argumente eingegebn:\n");
        exit(-1);
    }
    if((fd = open(argv[1], O_RDWR, S_IRWXU)) == -1)
    {
        errno = fd;
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    //Aus Datei in Array BUF einlesen
    if(read(fd, &BUF_FILE, sizeof(BUF_FILE)) == -1)
    {
        errno = fd;
        printf(":%s\n", strerror(errno));
        exit(-1);
    }
    //File-Deskriptor ans Ende der Datei
    if(lseek(fd, -1L ,SEEK_END) == -1)
    {
        errno = fd;
        printf(":%s\n", strerror(errno));
        exit(-1);
    }
    //Vergrößern um 20 chars
    int i = 0;
    while(i < 20){
        write(fd, &gap, sizeof(gap));
        i++;
    }
    //Text in Array BUF kopieren
    strcpy(BUF_TEXT, argv[2]);
    /*
    if(lseek(fd, -1L ,SEEK_END) == -1)
    {
        errno = fd;
        printf(":%s\n", strerror(errno));
        exit(-1);
    }*/

    if(write(fd, &BUF_TEXT, sizeof(BUF_TEXT)) == -1)
    {
        errno = fd;
        printf(":%s\n", strerror(errno));
        exit(-1);
    }
    if(lseek(fd, 0, SEEK_SET) == -1)
    {
        errno = fd;
        printf(":%s\n", strerror(errno));
        exit(-1);
    }
    if((read(fd, &BUF_OUT, sizeof(BUF_OUT))) ==-1)
    {
        errno = fd;
        printf("%s", strerror(errno));
        exit(-1);
    }
    if((write(1, &BUF_OUT, sizeof(BUF_OUT))) == -1)
    {
        errno = -1;
        printf("%s\n", strerror(errno));
        exit(-1);
    }
    close(fd);
    return EXIT_SUCCESS;
}

und bekomme als Lösung folgendes raus
 

Anhänge

  • text_test234.png
    text_test234.png
    1,7 KB · Aufrufe: 3

Neonof

Mitglied
Hallo Sekiro24,

ehrlich gesagt weiß ich nicht so richtig was mit deinem Post anzufangen. Vielleicht gab es bisher keine Antworten, weil es anderen ähnlich geht. Zuerst mal, was genau ist deine Frage? Ich nehme an, das Ergebnis ist unerwartet? Die Situation lässt sich für einen Außenstehenden kaum nachvollziehen, da du weder die verwendeten Parameter, noch die einzulesende Datei geliefert hast. Somit ist nicht wirklich klar, was denn zu erwarten wäre.

Was mir jetzt schonmal auffällt ist: Die Funktion write() soll doch in die Datei schreiben. Ich nehme an, es handelt sich dabei um eine äquivalente Funktion zur in io.h deklarierten:
C:
_ssize_t _write(int handle, const void *src, size_t num);

Diese Funktion erwartet als zweiten Parameter einen Pointer auf die Quelle. Bei einem Array ist der Name des Arrays bereits der Pointer auf das erste Element. Du hast in deinem Code mit
C:
&gap
einen Pointer auf diesen Pointer mitgegeben. Lass das & weg und es sollte geschrieben werden, was du erwartest.

Sollte das nicht helfen: Meine Compiler kommen mit unistd.h nicht klar, daher kann ich den Code nicht kompilieren. Lässt sich der Code umschreiben, so dass du die Bibliothek nicht mehr brauchst?

Gruß,
Neonof
 

Neue Beiträge