【问题标题】:Reading a file to char array then malloc size. (C)将文件读取到 char 数组然后 malloc 大小。 (C)
【发布时间】:2010-10-26 06:58:45
【问题描述】:

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

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

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

现在我该如何将那个文件逐个字符地读入char* fileArray

在我知道我需要对 char* 进行多大程度的 malloc 之前,我基本上如何才能将 FILE* 转换为 char*

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

【问题讨论】:

  • 你的意思是你不希望字符在连续的内存位置?

标签: c pointers malloc command-line-arguments


【解决方案1】:

如果只使用“真实”文件(不是流、设备等),您可以使用 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 可能同时发生变化,您仍然必须确保不会读取超出分配大小的内容。

【讨论】:

    【解决方案2】:

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

    • 指定您可以处理的最大大小,然后您只需分配一次(无论是作为全局还是在堆上)。
    • 如果您担心一次将文件全部放入内存,请分块处理文件。
    • 使用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 和读入tbuff 的字节数相加,如果大于max,则执行realloc 以将buffer 再增加50K(同时调整max) .

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

    【讨论】:

      猜你喜欢
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2014-09-14
      • 2015-07-07
      • 2019-12-03
      • 2016-06-23
      相关资源
      最近更新 更多