我有一部分内存要转储到文件中.一个原因是在某处保存信息,另一个原因是在我的程序重新启动时再次读取它.
这样做的正确方法是什么?
我的第一个想法是:
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++;
我的“数据结构”是否会像“charachters”一样存在,还是需要以某种二进制/ hexa数据模式编写?或者这是一种标准的做法吗?
解决方法
这个问题被称为“
serializing”,可以从琐碎到真正复杂.如果您的数据结构是自包含的,例如数组中的一堆像素,并且您知道数组维度,则可以将数据转储出来然后将其读回.
如果您的数据中有链接列表或任何类型的指针,那么一旦您将它们读回,这些指针就不会指向任何有效的指针.这是一种更正式的序列化方法开始有意义的地方.
这可以包括保存为文件格式,使用数据库,转换为XML或其他分层格式等.什么是OK解决方案完全取决于您拥有的数据类型,以及您在其上执行的操作类型以及您计划写入磁盘的频率以及从磁盘读回的频率. (或者网络.或者你在做什么.)
如果您拥有的是一小部分数据,并且您只想以最简单的方式编写它,请使用fwrite():
fwrite(my_pointer,MEMORY_SIZE,1,fp);
然后fread()读回数据.
另请参阅相关内容(或多或少取决于您的需求有多高级)serializing question on StackOverflow.
当不同类型的cpu应该能够彼此读取数据时,正确的serialization也解决了the problems that appear. C语言中的正确序列化比其他语言复杂得多.例如,在Lisp中,所有数据和代码都已经序列化.在Java中,有一些方法可以帮助您序列化数据. C语言的特性使其成为高性能和系统编程的合适语言,这也使其更难以用于其他一些事情.