2

将文件内容放入单个字符数组的最佳方法是什么?

我读过这个问题:

在 C 中获取文件内容的最简单方法

但是从评论中,我发现该解决方案不适用于大文件。我确实可以访问 stat 功能。如果文件大小超过 4 GB,我应该只返回一个错误吗?

文件的内容是加密的,因为它是由用户提供的,所以它可以像任何人想要的一样大。如果文件太大,我希望它返回错误并且不会崩溃。用文件的内容填充字符数组的主要目的是将其与另一个字符数组进行比较,并且(如果需要并配置为这样做)将这两者记录到一个日志文件(或多个日志文件,如果需要)。

4

2 回答 2

2

您可以使用fstat(3)from sys/stat.h。这是一个获取文件大小的小函数,如果文件小于 4GB,则分配内存,否则返回 (-1)。它将文件读取到传递给char *bufferchar * 的 char 数组中,其中包含整个文件的内容。使用后应该是 free 的。

#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>

char *loadlfile(const char *path)
{
    int file_descr;
    FILE *fp;
    struct stat buf;
    char *p, *buffer;

    fstat((file_descr = open(path, O_RDONLY)), &buf);

// This check is done at preprocessing and requires no check at runtime.
// It basically means "If this machine is not of a popular 64bit architecture,
// it's probably not 128bit and possibly has limits in maximum memory size.
// This check is done for the sake of omission of malloc(3)'s unnecessary
// invocation at runtime.

//    Amd 64               Arm64                      Intel 64       Intel 64 for Microsofts compiler.
#if !defined(__IA_64) || !defined(__aarch64__) || !defined(__ia64__) || !defined(_M_IA64)
#define FILE_MAX_BYTES (4000000000)
    // buf.st_size is of off_t, you may need to cast it.
    if(buf.st_size >= FILE_MAX_BYTES-1)
        return (-1);
#endif

    if(NULL == (buffer = malloc(buf.st_size + 1)))
        return NULL;

    fp = fdopen(file_descr, "rb");

    p = buffer;
    while((*p++ = fgetc(fp)) != EOF)
        ;
    *p = '\0';

    fclose(fp);
    close(file_descr);
    return buffer;
}

可以在@ http://sourceforge.net/p/predef/wiki/Home/找到一个非常广泛的用于各种事物的预定义宏列表。架构和文件大小检查的原因是,malloc有时可能会很昂贵,最好在不需要时省略/跳过它的使用。并查询最大的内存。整个 4gb 存储块的 4gb 只是浪费了那些宝贵的周期。

于 2013-01-03T20:28:06.980 回答
1

如果我正确理解了您的问题,请从那个人的代码中执行:

    char * buffer = 0;
    long length;
    FILE * f = fopen (filename, "rb");

    if (f)
    {
    fseek (f, 0, SEEK_END);
    length = ftell (f);
    if(length > MY_MAX_SIZE) {
          return -1;
    }

     fseek (f, 0, SEEK_SET);
     buffer = malloc (length);
    if (buffer)
    {
    fread (buffer, 1, length, f);
    }
    fclose (f);
    }

    if (buffer)
    {
      // start to process your data / extract strings here...
    }
于 2013-01-03T19:56:40.257 回答