我想将一部分内存转储到文件中。一个原因是将信息保存在某个地方,另一个原因是当我的程序重新启动时再次读取它。
这样做的正确方法是什么?
我的第一个想法是:
char* start = my_pointer;
int i;
for (i = 0; i < MEMORY_SIZE; i++) {
// write *start to file
start++;
}
可以全部写成字符吗?然后使用类似的东西将其恢复到内存中。
//loop
*my_pointer = fgetc(f);
my_pointer++;
我的“数据结构”会作为“字符”生存,还是我需要以某种二进制/十六进制数据模式编写它?或者这是这样做的标准方法?
这个问题被称为“序列化“并且范围可以从琐碎到非常复杂。如果您的数据结构是自包含的,例如数组中的一堆像素并且您知道数组维度,则可以将数据转储出来,然后将其读回。
例如,如果您的数据中有链表或任何类型的指针,那么一旦您读回它们,这些指针将不会指向任何有效的内容。这就是更正式的序列化方法开始有意义的地方。
范围包括保存为文件格式、使用数据库、转换为 XML 或其他分层格式等。什么是好的解决方案完全取决于您拥有什么类型的数据、您正在对数据执行什么类型的操作以及您计划写入然后从磁盘读回的频率。 (或者网络。或者无论你在做什么。)
如果您拥有的只是一小部分数据,并且您只想以最简单的方式将其写出,请使用fwrite():
fwrite(my_pointer, MEMORY_SIZE, 1, fp);
进而fread()读回数据。
另请参阅相关内容(或多或少相关取决于您的需求的高级程度)StackOverflow 上的序列化问题.
Proper 序列化也解决了出现的问题当不同类型的 CPU 应该能够互相读取数据时。 C 中的正确序列化比其他语言复杂得多。例如,在 Lisp 中,所有数据和代码都已序列化。在 Java 中,有一些方法可以帮助您序列化数据。 C 语言的特性使其成为一种适合高性能和系统编程的语言,但也使其更难以用于其他一些事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)