Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中获取文件内容_C_File Io_Character Arrays - Fatal编程技术网

在C中获取文件内容

在C中获取文件内容,c,file-io,character-arrays,C,File Io,Character Arrays,将文件内容放入单个字符数组的最佳方法是什么 我看过这个问题: 但是从评论中,我看到这个解决方案对于大文件来说并不好。我确实可以使用stat函数。如果文件大小超过4GB,我是否应该返回一个错误 文件的内容是加密的,因为它是由用户提供的,所以它可以像任何人希望的那样大。我希望它返回一个错误,而不是崩溃,如果文件太大。用文件内容填充字符数组的主要目的是将其与另一个字符数组进行比较,并且(如果需要并配置为这样做)将这两个字符数组都记录到一个日志文件(或多个日志文件,如果需要)。根据这家伙的代码,如果我

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

我看过这个问题:

但是从评论中,我看到这个解决方案对于大文件来说并不好。我确实可以使用stat函数。如果文件大小超过4GB,我是否应该返回一个错误


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

根据这家伙的代码,如果我正确理解您的问题,请执行以下操作:

    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...
    }
您可以从
sys/stat.h
使用
fstat(3)
。这里有一个获取文件大小的小函数,若文件小于4GB,则分配内存,否则返回(-1)。它将文件读取到传递给
char*buffer
a char*的char数组中,该数组包含整个文件的内容。使用后应释放该文件

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
char*loadlfile(常量char*path)
{
int文件描述;
文件*fp;
结构统计buf;
字符*p,*缓冲区;
fstat((file_descr=open(path,O_RDONLY)),&buf);
//此检查在预处理时完成,不需要在运行时进行检查。
//它的基本意思是“如果这台机器不是流行的64位架构,
//它可能不是128位,并且可能在最大内存大小上有限制。
//进行此检查是为了省略malloc(3)的不必要内容
//运行时调用。
//AMD64 Arm64英特尔64英特尔64微软编译器。
#如果!已定义(uu IA_64)| |!已定义(u aarch64_uuu)| |!已定义(u ia64_uuu)| |!已定义(_M_ia64)
#定义文件最大字节数(4000000000)
//buf.st_大小不正确,您可能需要将其丢弃。
如果(buf.st\u size>=文件最大字节数-1)
返回(-1);
#恩迪夫
if(NULL==(buffer=malloc(buf.st_size+1)))
返回NULL;
fp=fdopen(文件描述,“rb”);
p=缓冲区;
而((*p++=fgetc(fp))!=EOF)
;
*p='\0';
fclose(fp);
关闭(文件描述);
返回缓冲区;
}

可以找到各种各样的预定义宏的非常广泛的列表@。检查体系结构和文件大小的原因是,
malloc
有时可能很昂贵,最好在不需要的时候省略/跳过它的使用。而查询一个最大4gb的内存来获取整个4gb存储块只会浪费这些宝贵的周期。

如果要将文件内容与字符数组进行比较,无需将整个文件读入内存。只需迭代文件(一次读取4096字节),对照数组中的相应成员检查每个字节。这一点很好,但如果用户愿意,我需要在以后将它们写入日志。可能只是一个要比较的进程,然后另一个进程将它们写入日志文件?答案取决于文件数据的大小和类型。您链接的问题已经回答了这个问题“将文件内容放入单个字符数组的最佳方法是什么?”。据我所知,您想知道确定文件大小的最有效方法是什么……是吗?令人惊讶的是,有多少次人们说“我不明白您的问题”“当问题是C时。也许在试图排除它之前,试着完整地阅读这个问题?理解自己的错误并帮助他人。谢谢你的回答,几个问题,“rb”不是二进制的吗?另外,
fseek
可能会失败?1)是的,它意味着
读取二进制文件
。2) 我不确定
fseek()
是否会失败,但是否可以将值从返回到关闭?(我假设是POSIX环境,但我相信有窗口的等价物)感谢您的代码。我对
#define FILE_MAX_BYTES(4000000000)
行很好奇。这是为了防止内存分配超过4gb吗?如果我增加这个数字,会不会在某些平台上造成问题?是的,这是一个预防措施。但是这和if(buf.st\u size>=FILE\u MAX\u BYTES-1)检查并不是真正必要的,因为如果无法分配足够的内存,
malloc(3)
将返回空指针。我不认为这种文件大小等限制存在于大多数流行的C实现中,因为这些限制完全依赖于平台。有些文件系统不允许+4gb文件,有些机器(32位。不客气@SSHThis。我也要感谢你,因为这个问题让我找到了。这个问题有很多东西,任何人都需要。我建议你检查一下。那里丢失了有价值的信息。在函数返回之前是否应该使用
fclose
关闭fp?这有关系吗?顺便说一句,这个segfults。当声明缓冲区时在内部,没问题。所以我将修改它以在内部创建缓冲区并返回指向它的指针。对于未测试的代码,我感到抱歉。