如何在运行时将存储在文件中的char数组读入char缓冲区

Gio*_*Gio 2 c

我在C中工作,我正在修改现有代码.

我有一个char数组存储在一个文件中,如下所示:

"\x01\x02\x03"
"\x04\x05\x06"
"\x07\x08\x09"
Run Code Online (Sandbox Code Playgroud)

在原始源代码中,此char数组包含如下:

const static char chs[] =
#include "file.h"
;
Run Code Online (Sandbox Code Playgroud)

我正在修改此代码以在运行时将文件加载到char数组中(以获得与上述方法完全相同的结果),而不是预处理器包含它.我的第一种方法是简单地将文件读入char缓冲区,如下所示:

FILE *fp;
const char *filename = "file.h";
fp = fopen (filename, "rb");
assert(fp != NULL);

fseek(fp, 0L, SEEK_END);
long int size = ftell(fp);
rewind(fp);

// read entire file into the buffer
char *buffer = (char*)malloc(sizeof(char) * size);
size_t nrOfBytesRead = fread(buffer, 1, size, fp);
Run Code Online (Sandbox Code Playgroud)

但是我很快发现这不正确.该文件已包含char数组的确切代码表示,我不能简单地将其读入char缓冲区并获得与include方法相同的结果.

在运行时期间将存储在文件中的char数组放入char数组的最佳方法是什么?

Ste*_*mit 5

正如您所见,当您使用fread它读取文件时,它会逐字节地读取它.它没有得到编译器对源文件执行的任何语法处理.它不知道字符串存在于引号内.它不会将转义序列映射\x01为单个字节.

你有几种不同的可能性来解决这个问题:

  1. 教你的程序在读取文件时如何进行处理.这将是相当多的工作.
  2. 将所需的字节只放入文件中.
  3. 为您的文件选择不同的编码.

更多地谈论#2:如果你不想改变你的文件读取代码,你可以做的是创建一个(在这种情况下)9字节文件,只包含你想要的九个字节.由于你的九个字节不是文本,它最终将成为一个"二进制"文件,你将无法使用普通的文本编辑器直接编辑,等等.(事实上,取决于你可用的工具你,创建这个特殊的9字节文件可能很有挑战性.)

因此,如果您不能使用#1或#2,您可能想要使用#3:选择一种全新的方式对文件中的数据进行编码,比#1更容易解析,但比#2更容易准备.我的第一个想法是让文件是十六进制的.也就是说,该文件将包含

010203040506070809
Run Code Online (Sandbox Code Playgroud)

要么

010203
040506
070809
Run Code Online (Sandbox Code Playgroud)

您的文件读取代码(而不是单个调用fread)将一次读取两个字符并将它们组合成阵列的字节.(我会为你画出这个,但我正在等待的编辑已经完成,我应该回到我的工作.)