有一个 1 GB 的文件包含单个字符串。由于字符串非常大,因此无法完全加载到内存中。反转此字符串的最佳方法是什么?
问问题
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
我认为,解决您的问题的最佳选择是使用 mmap 将文件加载到内存中。请参阅 mmap 手册页以加载文件或阅读以下链接 何时应使用 mmap 进行文件访问?
于 2012-06-18T05:44:00.117 回答
0
将字符串划分为您的内存可以处理的子字符串。从末尾读取这些子字符串。反转每个子字符串并将结果打印到输出文件。
于 2012-06-18T06:14:37.067 回答