2012-10-29 49 views
1

我正在寫一個簡單的C程序來反轉文件中的字節(僅用於學習目的)。我正在打開我的文件,將它映射到內存中並反轉字節順序。所以第一個變成最後一個,最後一個變成第一個,等等。
在內存中一切工作正常(使用gdb檢查它)但是當我同步和取消映射內存驅動器上的文件沒有被改變(字節是在相同的順序,而不是顛倒)。
最糟糕的部分是我在運行程序時沒有遇到任何錯誤。
當然,我是該文件的所有者,它對我來說是可讀寫的。msync沒有真正將內存同步到文件

#include <stdio.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <string.h> 
#include <fcntl.h> 

int main (int argc, char *argv[]){ 
    int fd_in; 
    int i, j; 
    char tmp; 
    struct stat inode; 
    char *addr_in; 

    if(argc < 2){ 
     printf("Usage: %s input\n", argv[0]); 
     return -1; 
    } 

    fd_in = open(argv[1], O_RDWR); 

    if(fd_in == -1){ 
     perror("Error opening file"); 
     return 2; 
    } 

    if(fstat(fd_in, &inode)){ 
     perror("fstat error"); 
    } 

    addr_in = mmap(NULL, inode.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd_in, 0); 

    if(addr_in == (char*)(-1)){ 
     perror("Error mapping memory"); 
     close(fd_in); 
     return 2; 
    } 

    for(i = 0, j = inode.st_size-1; i < inode.st_size ; i++, j--){ 
     tmp = addr_in[i]; 
     addr_in[i] = addr_in[j]; 
     addr_in[j] = tmp; 
    } 
    if(msync(addr_in, inode.st_size, MS_SYNC) == -1){ 
     perror("sync error"); 
     return 2; 
    } 
    if(munmap(addr_in, inode.st_size) == -1){ 
     perror("unmap error"); 
     return 2; 
    } 
    close(fd_in); 

} 

回答

1
for(i = 0, j = inode.st_size-1; i < inode.st_size ; i++, j--) 

應該

for(i = 0, j = inode.st_size - 1; i < inode.st_size/2; i++, j--) 

如果沿着整個陣列去,你會扭轉它兩次,我。即基本上什麼都不會發生

+0

謝謝,你的回答幾乎是正確的。除了我不需要分割j變量的值,只有循環條件。 – xartii

+0

@xartii並放鬆謝謝。 – 2012-10-29 08:33:18

+0

因爲只要'i