Почему следующий код поднимает SegFault. C (Linux)
-
01-10-2019 - |
Вопрос
Этот код, который поменял бы данные документа и сохранить его в том же документе. Однако я получаю ошибку сегментации. Пожалуйста, помогите, я не знаю, почему это дает SegFault.
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main (int argc,char* argv[])
{
int fd,n,i,j;
char* buf;
if(argc<2)
printf("USAGE: %s file-to-reverse.\n",argv[0]);
fd=open(argv[1], O_RDWR);
if(fd==-1)
printf("ERROR: Cannot reverse %s,file does not exist.\n",argv[1]);
i = 0;
j = n-1;
while(i < j)
{
read(fd,buf,n);
char ib = buf[i];
char jb = buf[j];
jb = i++;
ib = j--;
write(fd,buf,n);
}
free(buf);
close(fd);
}
Редактировать1.Я пытался добавить:
#include <sys/stat.h>
struct stat fs;
fstat(fd, &fs);
n= fs.st_size;
buf = malloc(n * sizeof (char));
Но теперь это просто дублирует персонажей в документ снова и снова вместо того, чтобы обратить их.
Решение
Что касается вашего второго редактирования - ваша петля неверна.
(1) Возьмите прочитанные и напишите из цикла - вот почему он снова продолжает писать снова и снова.
(2) Вам нужно обратиться в начало файла, в противном случае вы просто будете добавлять новые данные в конец файла.
(3) На самом деле вы должны отменить символы в буфер, прежде чем написать их.
read(fd, buf, n);
while (i < j)
{
char t = buf[i];
buf[i] = buf[j];
buf[j] = t;
i++;
j--;
}
lseek(fd, 0, SEEK_SET);
write(fd, buf, n);
Другие советы
Вы не выделяете, ни инициализировать buf
.
Вы никогда не инициализированы n
Так что это может быть что-нибудь, даже негативное. Использовать fstat
или какой-то другой метод определить размер файла и хранить, что в n
.
Ваш буфер не выделяется и n = 0, поэтому вы постараетесь прочитать 0 символов. Это должно восстановить ваш код:
buf = malloc(10 * sizeof (char));
n = 10;
Ресурсы :