mic*_*ael 7 c executable storage
我需要找到一种在程序的可执行文件中存储250 KB纯文本数字的方法.
通常,我会将数据放在一个单独的文件中,让程序在运行时读取它,但这不是一个选项.相反,程序和数据需要在一个可执行文件中.
我完全不知道怎么做(除了写250.000 #defines :-),我很感激任何建议.
某种数组怎么样?只需将该定义放在一个文件中并将其编译到您的程序中:
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)
你可以生成一个数组定义.例如,假设你有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)