首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取一个文件到char数组,然后malloc大小。(C)

问读取一个文件到char数组,然后malloc大小。(C)
EN

Stack Overflow用户
提问于 2010-10-26 14:58:46
回答 2查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
int main(int argc, char** argv) {
    unsigned char* fileArray;

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

现在,如何将文件逐个读取到char* fileArray中

基本上,在我知道FILE*需要多大之前,如何将char*转换为char*

我知道一种可能的解决方案是使用缓冲区,但我这里的问题是,我正在处理可能超过900000个字符的文件,并且认为对于如此大的缓冲区是不合适的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-26 15:20:25

如果只有“真实”文件(不是流、设备等),则可以使用stat/fstat或类似于

代码语言:javascript
复制
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和read了。但是,由于file1可能会在此期间发生变化,因此您仍然必须确保读取的内容不会超出您的错误大小。

票数 2
EN

Stack Overflow用户

发布于 2010-10-26 15:02:41

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

  • 指定您可以处理的最大大小,然后只分配一次(无论是作为全局文件还是在堆上分配)。如果您担心一次将文件全部装入内存,
  • 将以块的形式处理文件。
  • 通过将malloc与realloc配合使用来处理任意大小(在您读取位时)。

第一个很简单:

代码语言:javascript
复制
static char buff[900001];                  // or malloc/free of 900000
count = fread (buff, 1, 900001, fIn);
if (count > 900000)                        // problem!

第二种方法可能是最好的方法,除非您确实需要立即在内存中存储整个文件。例如,如果您的程序计算了字数,它可以一次按顺序处理文件几千字。

第三,你可以维护一个buffer,used和max变量。最初将max设置为50K,并将buffer分配为该大小。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4021361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档