我是一名新程序员,我在编写链接列表到文本文件时遇到了一些麻烦。 这是我的代码:
typedef struct N {
int code;
char name[MAX1];
int items;
float price;
struct N *next;
} node_t;
typedef struct {
int code;
char name[MAX1];
int items;
float price;
} product;
product p;
product *ptr = &p;
node_t *iterator = head;
FILE *fp;
fp = fopen("newfile.txt", "w+");
while (iterator != NULL) {
p.code = iterator->code;
strcpy(p.name, iterator->name);
p.items = iterator->items;
p.price = iterator->price;
fwrite(ptr, 1, sizeof(product),fp);
iterator = iterator->next;
}
此时,我从流中读取并显示我应该写在" newfile.txt"上的内容,但所有打印出来的都是' 0'哪里应该有一个整数/浮点数,什么都不应该有一个字符串。 我也尝试用fputs()和其他函数写一个简单的整数文件,但它打印出随机数。 如果你想知道,因为我还没有在这里复制整个代码,列表不是空的,我可以正确显示其中的所有项目。 对不起,如果我还不清楚,这是我在这里发表的第一篇文章。希望有人能帮助我,谢谢!
答案 0 :(得分:1)
fwrite
只是写出数据的二进制表示,而不是像您希望在文本文件中看到的ASCII表示。例如,一个整数将由四个NUL
个字符表示,您将无法看到它们。所以你的代码可能正常工作。
如果您想以文字写出来,请使用fprintf
,例如:
fprintf(fp, "%d,%d,%lf,\"%s\"\n",
iterator->code, iterator->items, iterator->price, iterator->name);
将是CSV的粗略近似值(请注意,它不会转义名称中的字符)。
顺便说一下,为什么不添加node_t
product
的成员变量呢?然后你可以避免所有复制。
答案 1 :(得分:0)
我建议进行以下更改:
将每个节点的struct
划分为两个struct
s - 一个用于保存数据,另一个用于捕获下一个指针。
typedef struct
{
int code;
char name[MAX1];
int items;
float price;
} NodeData;
typedef struct N {
NodeData data;
struct N *next;
} node_t;
现在编写链表内容的功能可以是:
fp = fopen("newfile.txt", "w+");
// Get the size of the linked list and write as the first piece of data.
size_t listSize = getLinkedListSize(head)
fwrite(&listSize, 1, sizeof(size_t), fp);
// Now write each node of the linked list.
while (iterator != NULL) {
fwrite(&(iterator->data), 1, sizeof(iterator->data), fp);
iterator = iterator->next;
}