我使用realloc动态增加char指针(* seqA)的大小。还有另外一种方法吗?
这是我的代码的一部分:
while((holder=fgetc(fileA)) != EOF) {
lenA++;
temp=(char*)realloc(seqA,lenA*sizeof(char));
if (temp!=NULL) {
seqA=temp;
seqA[lenA-1]=holder;
}
else {
free (seqA);
puts ("Error (re)allocating memory");
exit (1);
}
}
答案 0 :(得分:1)
当您的代码将整个文件读入字符串时,为什么不使用以下代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
....
struct stat buf;
fstat(fileno(fileA), &buf);
seqA = malloc(buf.st_size);
fread(seqA, buf.st_size, 1, fileA);
当然,您应该检查这些功能的返回值并采取适当的措施。
答案 1 :(得分:0)
为什么质疑你算法的这么一小部分?对整个算法进行更全面的观察可能是一个更好的主意。您当前的算法取决于这个相当密集和不必要的代码。如果您可以消除将整个文件读入内存的依赖性,那么您的解决方案将具有更高的可扩展性。也许通过“一种更好地做到这一点的方式”,你的意思是“更快”或“所以我可以处理100GB大小的文件而不会停止”。
考虑一个finite state machine,它可以一次一个字节地从文件中读取,处理和提取所需信息。你可能不需要malloc这么多。如果没有对问题的具体描述,我们无法帮助您派生有限状态机来解决您的问题。但是,一个突出的例子可能是在100GB文件中找到一个最大整数:
while (fscanf(file, "%d", ¤t_num) == 1) {
if (current_num > max_num) {
max_num = current_num;
}
}
这段代码显然不需要malloc,更不用说将整个文件读入内存了;无论文件大小如何,它都只会使用恒定的内存量。