我正在阅读并将结构写入一个不可读的文本文件。我必须从结构对象中将可读数据写入文件。
以下是我的代码的更多细节:
我正在使用代码读取和写入项目名和代码列表到文件(file.txt)中。该代码使用链表概念来读写数据。 数据存储在结构对象中,然后使用fwrite写入文件。
代码运行正常。但我需要在文本文件中写入可读数据。
现在file.txt看起来像是吼叫,
㵅㡸䍏䥔䥆㘸䘠㵅㩃䠀\䵏㵈䑜㵅㡸䍏䥔䥆㘸䘠\㵅㩃䠀䵏㵈䑜㵅㡸䍏䥔䥆㘸䘠㵅㩃䠀䵏㵈\䑜㵅㡸䍏䥔䥆㘸䘠㵅㩃䠀䵏㵈䑜㵅㡸䍏䥔\䥆㘸䘠㵅㩃䠀䵏㵈
我希望文件应该是这样的,
铅笔aaaa以下是摘录:
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;
}
答案 0 :(得分:1)
The code works fine
不是真的:
a)您正在将结构的原始内容转储到文件中,包括指向另一个实例的指针(如果是“Item”)。你不能期望从光盘读回指针并像使用ptrthis = ptrthis->ptrnext
一样使用它(我的意思是,这可以在给定的片段中“使用”它,但仅仅因为该片段没有任何意义全部)。
b)您正在向文件写入2 * 255字节的潜在废话。您在文件中看到这个奇怪的“块”的原因是,您将所有255个字节的itemname
和255个字节的dspidc
写入光盘..包括终止\0
(哪些是块,取决于你的编辑器)。真正的“字符串”在itemname
或dspidc
的开头是有意义的,后跟\0
,后跟内存中的任何内容。
你需要查找和阅读的术语称为serialization,已经有一些库可以解决将数据结构转储到光盘(或网络或其他任何东西)并将其读回的任务,例如tpl。
答案 1 :(得分:1)
写入一个255字节的数组大小会将255个字节写入文件(无论你填入该数组的是什么)。如果只想要该数组的“文本”部分,则需要使用处理空终止符的工具(即printf
,fprintf
,...)。
因为您需要设置表示字符串结尾的标记值的概念,因此阅读会更复杂。
这并没有说明您正在编写指针(已初始化或未指定)的值,该指针在下次读取时没有上下文或有效性。指针(即存储器位置)仅在当前正在执行的过程中具有应用。试图在另一个进程中使用一个进程的内存地址肯定是一个坏主意。
答案 2 :(得分:0)
首先,我只会序列化数据,而不是指针。
然后,在我看来,你有两个选择:
抱歉,我找不到在线文档,但我知道我的语法是纸上谈兵。 这两种解决方案都是独立于平台的,无论是big endian还是little endian。