Создать новый файл для записи в C и инициализировать его как пустой? - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу открыть новый файл и записать в него массив char, но когда я читаю содержимое файла, в нем есть то, что я написал, а затем куча мусорных символов.

I хочу сопоставить файл с памятью, но когда я читаю файл обратно с этой карты, я получаю случайные символы, следующие за ним.

...
char *towrite = "12345"

int fd = open("file.txt",  O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

struct stat sb;

write(fd, &towrite, sizeof(towrite));

if(fstat(fd, &sb) != -1){
     printf("file is %ld bytes long.\n", sb.st_size);
}

char *mappedfile = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

for(int z=0; z < sb.st_size; z++){
     printf("%c", mappedfile[z]);
}
printf("\n");
close(fd);
...

Я также заметил, что размер файла возвращается как 1790 байты, которые на самом деле не кажутся правильными, когда я пишу только массив символов такого маленького размера.

Простите меня за наглость, я совершенно новичок в чтении и записи файлов, а также в сопоставлении файлов , Я просто не могу понять, что я делаю неправильно с документацией, которую я нашел в Интернете.

Спасибо!

1 Ответ

2 голосов
/ 01 апреля 2020

Эта строка не та, которую вы хотите:

write(fd, &towrite, sizeof(towrite));

Это записывает значение указателя towrite в файл, а не в строку, на которую он указывает. Более того, для указателя sizeof - это размер указателя, а не размер того, на что он указывает.

Вы, вероятно, хотите

write(fd, towrite, strlen(towrite));

Вы также можете изменить towrite в массив и выполните

char towrite[] = "12345";
write(fd, towrite, sizeof(towrite));

, но тогда также будет записан завершающий нулевой байт, если только вы не используете sizeof(towrite)-1.

Кроме того, вы не используете флаг O_TRUNC при открытии, поэтому файл не будет усечен: если файл уже существует, любые данные, которые уже находятся в файле за пределами 5 байтов, которые вы пишете, останутся там. Ваши 1790 байт могут быть оставлены после предыдущего тестирования. Если вы хотите стереть предыдущее содержимое и начать заново с пустого файла, откройте с флагами O_RDWR | O_CREAT | O_TRUNC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...