动态包含C可执行文件中的文本

时间:2014-11-01 23:29:35

标签: c unix

非常 C和编译语言的新手。我需要在此代码中基本上包含来自另一个文件的一行动态文本:

#if T2T_NDEFFILE_PREDEF == URI
const uint8_t T2T_DATA_DEF[] = {
#include "/home/link"
      // Terminator TLV
      0xF3
};
#endif

我尝试使用#include链接到文本文件,但是当文件'link'中的文本发生更改时,它显然不会在编译的可执行文件中更改。有没有简单的方法呢?

1 个答案:

答案 0 :(得分:2)

#include指令只是将另一个文件的内容复制到源代码中,然后由C编译器转换为可执行文件。换句话说,这是一次性过程,其他文件“烘焙”到您的代码中。

如果您需要在每次运行程序时“动态”重新加载文件的内容,则需要使用C代码自行加载。这是一个例子,来自我自己的一个项目:

/*
[PUBLIC] Load the contents of a file into a malloc()'d buffer.
*/

unsigned char *txtLoadFile(const char *file_name, long *length)
{

  FILE          *fsrc = NULL;
  unsigned char *data = NULL;
  long          size  = 0;

  /* Attempt to open the requested file. */

  fsrc = fopen(file_name, "rb");
  if (!fsrc) { return NULL; }

  /* Get the length of the file in bytes. */

  fseek(fsrc, 0, SEEK_END);
  size = (long)ftell(fsrc);
  rewind(fsrc);

  /* Copy the data into memory (with an extra zero byte, in case it's text). */

  data = (unsigned char*)malloc(size + 1);

  if (data)
  {
    memset(data, 0, size + 1);
    fread(data, 1, size, fsrc);
  }

  fclose(fsrc);

  /* Return the result. */

  if (length) { *length = size; }

  return data;

}

这段代码应该在很大程度上不言自明,但有一些事情值得指出:

  • 正在rb(读取二进制)模式下打开文件 - 您可能需要使用r(读取文本),具体取决于您正在执行的操作。如果是这样,您可能希望使用普通char*而不是unsigned char *来存储数据,就像我在这里所做的那样。
  • 为字符串的零NULL终结符字符分配额外的字节。
  • 缓冲区存储在动态分配的内存中。由于您似乎更熟悉Python或Ruby等动态语言,因此我应该提醒您,完成后需要free()分配的内存。