1GBのファイルに1文字の文字列が含まれています。文字列が非常に大きいため、メモリに完全にロードすることはできません。この文字列を逆にする最良の方法は何ですか?
質問する
741 次
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 に答える