2

1GBのファイルに1文字の文字列が含まれています。文字列が非常に大きいため、メモリに完全にロードすることはできません。この文字列を逆にする最良の方法は何ですか?

4

5 に答える 5

4

ブロックをメモリにロードし、順番に書き出しながら逆に反復します。疑似コード:

load_block(buffer, 4mb, end of file); // Load a 4mb block from the end
for (i = 4mb; i>=0; i--) {
    write(buffer[i],1); // Write it out in reverse
}
于 2012-06-18T03:33:22.853 に答える
1

ファイルを最後から繰り返し処理し、バイトごとにメモリにロードし(8ビット文字を想定)、最初から開始された出力ファイルに保存できます

于 2012-06-18T03:31:21.870 に答える
1

それを行う迅速かつ汚い方法。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(int argc, char ** argv) {
    FILE * in,*out;
    assert(argc>2);
    in = fopen(argv[1],"rb");
    out = fopen(argv[2],"wb");
    assert(in);
    assert(out);
    assert(0==fseek(in,0,SEEK_END));
    assert(0==fseek(in,-1,SEEK_CUR));
    fputc(fgetc(in),out);
    while (!fseek(in,-2,SEEK_CUR)) {
            fputc(fgetc(in),out);
    }
    fclose(in);
    fclose(out);
    return 0;
}

コメントごとに追加。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void flip(char *a, int size) {
    int i;char c;
    for (i=0;i<size/2;++i) {
            c=a[size-1-i];
            a[size-1-i] = a[i];
            a[i]=c;
    }
}
int main(int argc, char ** argv) {
    const size_t chunksize = 4096;
    char buffer[chunksize];
    size_t chunks;
    size_t rest;
    FILE * in,*out;
    size_t t;
    assert(argc>2);
    in = fopen(argv[1],"rb");
    out = fopen(argv[2],"wb");
    assert(in);
    assert(out);
    assert(0==fseek(in,0,SEEK_END));
    t = ftell(in);
    assert(t>0);
    chunks = t/chunksize;
    rest = t%chunksize;
    assert(0==fseek(in,-rest,SEEK_CUR));
    assert(rest == fread(buffer, 1, rest, in));
    flip(buffer, rest);
    assert(rest == fwrite(buffer,1,rest,out));
    while (!fseek(in,-(chunksize+rest),SEEK_CUR)) {
            rest = chunksize;
            assert(rest == fread(buffer, 1, rest, in));
            flip(buffer, rest);
            assert(rest == fwrite(buffer,1,rest,out));
    }
    fclose(in);
    fclose(out);
    return 0;
}
于 2012-06-18T08:19:51.853 に答える
0

文字列をメモリが処理できるサブ文字列に分割します。これらのサブ文字列を最後から読み取ります。各サブ文字列を逆にして、結果を出力ファイルに出力します。

于 2012-06-18T06:14:37.067 に答える
0

あなたの問題に対する最良の選択肢は、 mmap を使用してファイルをメモリにロードすることだと思います。mmap のマニュアル ページを参照してファイルをロードするか、次のリンクを参照 してください。

于 2012-06-18T05:44:00.117 に答える