我在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数组的最佳方法是什么?
正如您所见,当您使用fread它读取文件时,它会逐字节地读取它.它没有得到编译器对源文件执行的任何语法处理.它不知道字符串存在于引号内.它不会将转义序列映射\x01为单个字节.
你有几种不同的可能性来解决这个问题:
更多地谈论#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)将一次读取两个字符并将它们组合成阵列的字节.(我会为你画出这个,但我正在等待的编辑已经完成,我应该回到我的工作.)