我有一部分内存要转储到文件中.一个原因是在某处保存信息,另一个原因是在我的程序重新启动时再次读取它.
这样做的正确方法是什么?
我的第一个想法是:
char* start = my_pointer;
int i;
for (i = 0; i < MEMORY_SIZE; i++) {
// write *start to file
start++;
}
Run Code Online (Sandbox Code Playgroud)
我可以把它全部写成字符吗?然后使用这样的东西将其恢复到内存中.
//loop
*my_pointer = fgetc(f);
my_pointer++;
Run Code Online (Sandbox Code Playgroud)
我的"数据结构"是否会像"charachters"一样存在,还是需要以某种二进制/ hexa数据模式编写?或者这是一种标准的做法吗?
Pro*_*ica 10
这个问题被称为" 序列化 ",可以从简单到复杂.如果您的数据结构是自包含的,例如数组中的一堆像素,并且您知道数组维度,则可以将数据转储出来然后将其读回.
如果您的数据中有链接列表或任何类型的指针,那么一旦您将它们读回,这些指针就不会指向任何有效的指针.这是一种更正式的序列化方法开始有意义的地方.
这可以包括保存为文件格式,使用数据库,转换为XML或其他分层格式等.什么是OK解决方案完全取决于您拥有的数据类型,以及您在其上执行的操作类型以及您计划写入磁盘的频率以及从磁盘读回的频率.(或者网络.或者你在做什么.)
如果您拥有的是一小块数据,并且您只想以最简单的方式编写它,请使用fwrite():
fwrite(my_pointer, MEMORY_SIZE, 1, fp);
Run Code Online (Sandbox Code Playgroud)
然后fread()重新读取数据.另请参阅StackOverflow上的相关(或多或少相关,具体取决于您的需求有多高级)序列化问题.
正确的序列化还解决了当不同类型的CPU应该能够彼此读取数据时出现的问题.C语言中的正确序列化比其他语言复杂得多.例如,在Lisp中,所有数据和代码都已经序列化.在Java中,有一些方法可以帮助您序列化数据.C语言的特性使其成为高性能和系统编程的合适语言,这也使其更难以用于其他一些事情.
| 归档时间: |
|
| 查看次数: |
6883 次 |
| 最近记录: |