2010-10-26 121 views
0

嘿,让我们说我得到一个文件作为第一个命令行参数。将文件读取到char数组然后malloc大小。 (C)

int main(int argc, char** argv) { 
    unsigned char* fileArray; 

    FILE* file1 = fopen(argv[1], "r"); 
} 

现在我该如何去读取该文件,char by char,到char* fileArray

基本上我怎么可以转换FILE*char*之前,我知道我需要多大的malloc char*

我知道一个可能的解决方案是使用一个缓冲,但在这里我的问题是我处理文件可能有超过900000个字符,并且看不到它适合制作一个很大的缓冲区。

+0

你的意思是你不想要连续存储位置中的字符? – Naveen 2010-10-26 07:02:43

回答

2

如果只有“真实”的文件(不流,设备,...)时,您可以使用stat/fstat或类似

int retval=fseek(file1,0,SEEK_END); // succeeded if ==0 (file seekable, etc.) 
long size=ftell(file1); // size==-1 would be error 
rewind(file1); 

事先获得文件的大小。然后你可以malloc和读取。 但由于file1可能在此期间发生变化,您仍然必须确保不会超出您的malloced尺寸。

1

有几个办法可以采取:

  • 指定您可以处理最大尺寸,那么你只需要分配一次(无论是作为一个全球性的或堆)。
  • 如果您担心一次将所有内容装入内存,则会以大块的方式处理文件。
  • 通过使用mallocrealloc(当您读取位时)处理任意大小。

1号很容易:

static char buff[900001];     // or malloc/free of 900000 
count = fread (buff, 1, 900001, fIn); 
if (count > 900000)      // problem! 

2号可能是做到这一点的最好办法,除非你绝对需要内存中的整个文件一次。例如,如果您的程序计算单词的数量,它可以一次按顺序处理文件几K。

编号3,您可以保留一个bufferusedmax变量。最初将max设置为50K,并将buffer分配为该大小。

然后尝试读取一个10K块到固定缓冲区tbuff。将当前的used和读入的字节数相加,并且如果大于max,则执行realloc以将buffer增加另一个50K(同时调整max)。

然后附加tbuffbuffer,调整used,冲洗并重复。请注意,所有这些值(10K,50K等)仅为示例。根据您的需要,您可以使用不同的值。

相关问题