Perché il codice seguente sollevare un segfault. c (Linux)
-
01-10-2019 - |
Domanda
Questo è un codice che avrebbe invertire i dati di un documento e salvarlo nello stesso documento stesso. Comunque io sono sempre un Fault.Please Aiuto segmentazione, non so il motivo per cui si dà un 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 Ho provato ad aggiungere:
#include <sys/stat.h>
struct stat fs;
fstat(fd, &fs);
n= fs.st_size;
buf = malloc(n * sizeof (char));
ma ora è solo duplica i personaggi all'interno del documento ancora e ancora, invece di li retromarcia.
Soluzione
Per quanto riguarda il secondo EDIT -. Il ciclo è sbagliato
(1) Prendere la lettura e scrittura fuori dal giro -. È per questo che continua a scrivere di nuovo e di nuovo
(2) è necessario chiedere di nuovo all'inizio del file, altrimenti sarà solo aggiungendo i nuovi dati alla fine del file.
(3) In realtà è necessario invertire i caratteri nel buffer prima di scrivere fuori.
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);
Altri suggerimenti
Non c'è allocare, nè buf
inizializzazione.
Non si può mai inizializzato n
quindi potrebbe essere qualsiasi cosa, addirittura negativo. Utilizzare fstat
o qualche altro metodo per determinare la dimensione del file e negozio che in n
.
Il buffer non viene assegnata e n = 0 in modo da provare a leggere 0 caratteri. Ciò dovrebbe riparare il vostro codice:
buf = malloc(10 * sizeof (char));
n = 10;
Risorse: