如何在可执行文件中存储数据

mic*_*ael 7 c executable storage

我需要找到一种在程序的可执行文件中存储250 KB纯文本数字的方法.

通常,我会将数据放在一个单独的文件中,让程序在运行时读取它,但这不是一个选项.相反,程序和数据需要在一个可执行文件中.

我完全不知道怎么做(除了写250.000 #defines :-),我很感激任何建议.

R S*_*hko 8

某种数组怎么样?只需将该定义放在一个文件中并将其编译到您的程序中:

int external_data[] =
{
    ...
};
Run Code Online (Sandbox Code Playgroud)

您可以让编译器告诉您外部数据中有多少元素:

size_t external_data_max_idx = sizeof(external_data) / sizeof(*external_data);
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 5

你可以生成一个数组定义.例如,假设你有numbers.txt:

$ head -5 numbers.txt
0.99043748698114
0.0243802034269436
0.887296518349228
0.0644020236531517
0.474582201929554
Run Code Online (Sandbox Code Playgroud)

我使用以下示例生成了它:

$ perl -E'say rand() for (1..250_000)' >numbers.txt
Run Code Online (Sandbox Code Playgroud)

然后将其转换为C数组定义,您可以使用脚本:

$ perl -lpE'BEGIN{ say "double data[] = {"; }; 
>     END{ say "};" }; 
>     s/$/,/' > data.h < numbers.txt 
Run Code Online (Sandbox Code Playgroud)

它产生:

$ head -5 data.h
double data[] = {
0.99043748698114,
0.0243802034269436,
0.887296518349228,
0.0644020236531517,

$ tail -5 data.h
0.697015237317363,
0.642250552146166,
0.00577098769553785,
0.249176256744811,
};
Run Code Online (Sandbox Code Playgroud)

它可以在您的程序中使用如下:

#include <stdio.h>    
#include "data.h"

int main(void) {
  // print first and last numbers
  printf("%g %g\n", data[0], data[sizeof(data)/sizeof(*data)-1]);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行:

$ gcc *.c && ./a.out
0.990437 0.249176
Run Code Online (Sandbox Code Playgroud)