Почему следующий код вызывает SegFault.с (Linux) - PullRequest
0 голосов
/ 05 сентября 2010

Это код, который обратит данные документа и сохранит их в том же самом документе.Однако я получаю ошибку сегментации. Пожалуйста, помогите, я не знаю, почему он дает ошибку 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);
}

EDIT1 Я попытался добавить:

#include <sys/stat.h>
struct stat fs;


  fstat(fd, &fs);
  n= fs.st_size;
  buf = malloc(n * sizeof (char));

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

Ответы [ 4 ]

2 голосов
/ 05 сентября 2010

Вы никогда не инициализировали n, поэтому это может быть что угодно, даже отрицательное.Используйте fstat или другой метод, чтобы определить размер файла и сохранить его в n.

2 голосов
/ 05 сентября 2010

Ваш буфер не выделен и n = 0, поэтому вы попытаетесь прочитать 0 символов. Это должно исправить ваш код:

buf = malloc(10 * sizeof (char));
n = 10;

Ресурсы:

2 голосов
/ 05 сентября 2010

Вы не выделяете и не инициализируете buf.

1 голос
/ 06 сентября 2010

Относительно вашего второго РЕДАКТИРОВАНИЯ - ваш цикл неправильный.

(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);
...