2013-03-04 53 views
0

我使用realloc来动态增加字符指针(* 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

什么是'seqA'是它的动态分配? – 2013-03-04 12:09:14

+3

你可以做什么(提高执行速度并减少内存碎片)是**最小化**重新分配的次数。例如,每次加倍缓冲区大小并跟踪逻辑缓冲区的结束位置。 – 2013-03-04 12:11:05

+0

出于兴趣,做'* sizeof(char)'从来没有任何意义 - 根据定义,这是1。字符在不同的系统中可以有不同的位数,但sizeof仍然是1. – Vicky 2013-03-04 12:21:04

回答

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

我希望我能给出这个答案我的批准,但由于以下原因,我不能:1.这个问题没有提到POSIX,并且fstat在标准C中不存在。2.即使这是在POSIX C环境中编译的,off_t(buf.st_size的类型)可能会表示比size_t更高的值fread第二个参数的类型)。如果发生这种情况,该代码可能无法读取整个文件。 3.即使在POSIX C环境下编译,并且size_t可以表示off_t的所有正值,但可能将2GB读入数组似乎是荒谬的! – Sebivor 2013-03-04 14:21:58

+0

我在做一些假设。至于OP将它读入内存的潜在文件大小,人们可以认为正在读取的文件不会那么大。 'fstat'可以使用'fseek'来解决。 – 2013-03-04 21:31:12

0

为什么问你的算法的这么小的一部分?对整个算法进行更全面的考察可能是一个更好的主意。你目前的算法取决于这个相当密集和不必要的代码。如果您可以删除将整个文件读入内存的这种依赖性,那么您的解决方案将更具可扩展性。也许通过“更好地做到这一点”,你的意思是“更快”或“因此我可以处理大小为100GB的文件,而不会停止爬行”。

考虑一个finite state machine,它可以从您的文件中一次读取,处理和提取所需的信息。你可能不会需要malloc这么多。如果没有关于您的问题的具体描述,我们无法帮助您推导出有限状态机来解决您的问题。然而,突出一个例子可能是一个100GB的文件中查找的最大整数:

while (fscanf(file, "%d", &current_num) == 1) { 
    if (current_num > max_num) { 
     max_num = current_num; 
    } 
} 

此代码显然并不需要的malloc,更不用说整个文件读入内存;无论文件大小如何,它只会使用恒定的内存量。