2

有一个 1 GB 的文件包含单个字符串。由于字符串非常大,因此无法完全加载到内存中。反转此字符串的最佳方法是什么?

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

我认为,解决您的问题的最佳选择是使用 mmap 将文件加载到内存中。请参阅 mmap 手册页以加载文件或阅读以下链接 何时应使用 mmap 进行文件访问?

于 2012-06-18T05:44:00.117 回答
0

将字符串划分为您的内存可以处理的子字符串。从末尾读取这些子字符串。反转每个子字符串并将结果打印到输出文件。

于 2012-06-18T06:14:37.067 回答