将文件读取到char数组然后读取malloc大小。 (C)

时间:2010-10-26 06:58:46

标签: c pointers malloc command-line-arguments

嘿,让我说我得到一个文件作为第一个命令行参数。

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

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

现在我怎样才能将这个文件(char by char)读入char* fileArray

基本上我怎么能在{I}知道我需要多大的FILE*

之前将char*转换为char*

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以采取以下几种方法:

  • 指定您可以处理的最大大小,然后您只需分配一次(无论是作为全局还是作为堆)。
  • 如果您担心一次将所有内容都安装到内存中,则会以块的形式处理文件。
  • 使用malloc realloc处理任意大小(当您读取位时)。

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和读取的字节数添加到tbuff,如果大于max,请执行realloc以将buffer再增加50K (同时调整max)。

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