1

私はファイル内のバイトを逆にするための単純なCプログラムを書いています(学習目的のためだけに)。ファイルを開いてメモリにマップし、バイト順序を逆にします。つまり、最初のものが最後になり、最後のものが最初になります。
メモリ内ではすべてが正常に機能しますが(gdbでチェック)、メモリを同期してマップ解除しても、ドライブ上のファイルは変更されません(バイトは同じ順序であり、逆になりません)。
最悪の部分は、プログラムの実行中にエラーが発生しないことです。
そしてもちろん、私はファイルの所有者であり、私にとっては読み取りと書き込みが可能です。

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

}
4

1 に答える 1

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

配列全体に沿って進むと、2回反転します。つまり、基本的に何も起こりません。

于 2012-10-29T07:59:23.617 に答える