2010-09-05 40 views
0

這是一個可以反轉文檔數據並將其保存在同一文檔中的代碼。 但是我得到一個Segmentation Fault.Please幫助,我不知道它爲什麼會給出一個SegFault。爲什麼下面的代碼會引發SegFault? c(Linux)

#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)); 

,但現在它只是一遍又一遍,而不是 複製文檔裏面的人物倒他們。

+0

除了答案「n」沒有在行「j = n-1;」中初始化。 – vobject 2010-09-05 19:46:01

回答

1

關於你的第二個編輯 - 你的循環是錯誤的。

(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); 
+0

謝謝你。它現在的作品:) – Pavitar 2010-09-06 03:43:47

2

您不分配,也不初始化buf

2

您從未初始化n所以它可能是任何東西,甚至是負面的。使用fstat或其他一些方法來確定文件的大小並將其存儲在n中。

+0

PLease檢查編輯1 – Pavitar 2010-09-05 20:01:17

相關問題