将结构写入C中的文件

时间:2010-07-23 09:48:42

标签: c file programming-languages pointers struct

我正在阅读并将结构写入一个不可读的文本文件。我必须从结构对象中将可读数据写入文件。

以下是我的代码的更多细节:

我正在使用代码读取和写入项目名和代码列表到文件(file.txt)中。该代码使用链表概念来读写数据。 数据存储在结构对象中,然后使用fwrite写入文件。

代码运行正常。但我需要在文本文件中写入可读数据。

现在file.txt看起来像是吼叫,

㵅㡸䍏䥔䥆㘸䘠㵅㩃䠀\䵏㵈䑜㵅㡸䍏䥔䥆㘸䘠\㵅㩃䠀䵏㵈䑜㵅㡸䍏䥔䥆㘸䘠㵅㩃䠀䵏㵈\䑜㵅㡸䍏䥔䥆㘸䘠㵅㩃䠀䵏㵈䑜㵅㡸䍏䥔\䥆㘸䘠㵅㩃䠀䵏㵈

我希望文件应该是这样的,

铅笔aaaa
表bbbb
笔cccc
笔记本nnnn

以下是摘录:

struct Item
{
char itemname[255];
char dspidc[255];
struct Item *ptrnext;
};

  // Writing into the file
printf("\nEnter Itemname: ");
gets(ptrthis->itemname);
printf("\nEnter Code: ");
gets(ptrthis->dspidc);
fwrite(ptrthis, sizeof(*ptrthis), 1, fp);

  // Reading from the file
while(fread(ptrthis, sizeof(*ptrthis), 1, fp) ==1)
{
  printf("\n%s %s", ptrthis->itemname,ptrthis->dspidc);
  ptrthis = ptrthis->ptrnext;
}

3 个答案:

答案 0 :(得分:1)

The code works fine

不是真的:

a)您正在将结构的原始内容转储到文件中,包括指向另一个实例的指针(如果是“Item”)。你不能期望从光盘读回指针并像使用ptrthis = ptrthis->ptrnext一样使用它(我的意思是,这可以在给定的片段中“使用”它,但仅仅因为该片段没有任何意义全部)。

b)您正在向文件写入2 * 255字节的潜在废话。您在文件中看到这个奇怪的“块”的原因是,您将所有255个字节的itemname和255个字节的dspidc写入光盘..包括终止\0(哪些是块,取决于你的编辑器)。真正的“字符串”在itemnamedspidc的开头是有意义的,后跟\0,后跟内存中的任何内容。

你需要查找和阅读的术语称为serialization,已经有一些库可以解决将数据结构转储到光盘(或网络或其他任何东西)并将其读回的任务,例如tpl

答案 1 :(得分:1)

写入一个255字节的数组大小会将255个字节写入文件(无论你填入该数组的是什么)。如果只想要该数组的“文本”部分,则需要使用处理空终止符的工具(即printffprintf,...)。

因为您需要设置表示字符串结尾的标记值的概念,因此阅读会更复杂。

这并没有说明您正在编写指针(已初始化或未指定)的值,该指针在下次读取时没有上下文或有效性。指针(即存储器位置)仅在当前正在执行的过程中具有应用。试图在另一个进程中使用一个进程的内存地址肯定是一个坏主意

答案 2 :(得分:0)

首先,我只会序列化数据,而不是指针。

然后,在我看来,你有两个选择:

  1. 为您的语法编写解析器(例如使用yacc)
  2. 使用数据转储格式,如rmi序列化机制。
  3. 抱歉,我找不到在线文档,但我知道我的语法是纸上谈兵。 这两种解决方案都是独立于平台的,无论是big endian还是little endian。

相关问题