无法将正确的文件目录输出到带有 .cFileName 的链表
Cannot output correct file directories to a linked list with .cFileName
我正在尝试创建一个链表,其中的各个节点具有我文件夹中的文件名。对于每个附加文件夹,我想输出整个链接列表,其中包含以前已加载文件的名称。我在我的 C:\Intel 文件夹中有 2 个文件 - ExtremeGraphics 和 Logs。这是我的全部代码。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct item{
char *data;
struct item *next;
} tItem;
int insert(char *x, tItem **top){
tItem *temp = (tItem *)malloc(sizeof(tItem));
temp->data = x;
temp->next = *top;
*top = temp;
tItem *iterator;
iterator = *top;
while(iterator!=NULL){//display whole linked list
printf("\n\tNode data: %s, node next:0x%x\n", iterator->data, iterator->next);
iterator = iterator->next;
}
return 0;
}
int main()
{
tItem *head = NULL;
WIN32_FIND_DATA FindFileData;
HANDLE hFind, hFind_2;
hFind = FindFirstFile("C:\Intel\*.*", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{ printf ("FindFirstFile failed (%d)\n", GetLastError());
return;}
else
{
while (FindNextFile(hFind, &FindFileData))
{
printf ("\n\nNext file found is %s\n", FindFileData.cFileName);
insert(FindFileData.cFileName, &head);
}
FindClose(hFind);
}
return 0;
}
输出为:
Next file found is ..
Node data: .., node next:0x0
Next file found is ExtremeGraphics
Node data: ExtremeGraphics, node next:0x330f80
Node data: ExtremeGraphics, node next:0x0
Next file found is Logs
Node data: Logs, node next:0x330fa0
Node data: Logs, node next:0x330f80
Node data: Logs, node next:0x0
我不知道为什么在 Logs 和 ExtremeGraphics,我不会在任何地方覆盖它。
感谢任何建议。
保存文件名时,您将指向链表中查找数据结构的 cFileName
成员的指针存储。所有列表元素都将指向那里。
此 cFileName
成员变量会被随后对 FindNextFile()
的调用用新找到的文件名覆盖。由于列表元素都指向那里,打印它们将重复打印姓氏。
要真正保存文件名,您必须在列表中存储 cFileName
的副本,例如使用 strdup()
.
创建的副本
你需要复制 x:
int insert(char *x, tItem **top){
tItem *temp = (tItem *)malloc(sizeof(tItem));
temp->data = strdup(x);
temp->next = *top;
*top = temp;
tItem *iterator;
iterator = *top;
while(iterator!=NULL){//display whole linked list
printf("\n\tNode data: %s, node next:0x%x\n", iterator->data, iterator->next);
iterator = iterator->next;
}
return 0;
}
我正在尝试创建一个链表,其中的各个节点具有我文件夹中的文件名。对于每个附加文件夹,我想输出整个链接列表,其中包含以前已加载文件的名称。我在我的 C:\Intel 文件夹中有 2 个文件 - ExtremeGraphics 和 Logs。这是我的全部代码。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct item{
char *data;
struct item *next;
} tItem;
int insert(char *x, tItem **top){
tItem *temp = (tItem *)malloc(sizeof(tItem));
temp->data = x;
temp->next = *top;
*top = temp;
tItem *iterator;
iterator = *top;
while(iterator!=NULL){//display whole linked list
printf("\n\tNode data: %s, node next:0x%x\n", iterator->data, iterator->next);
iterator = iterator->next;
}
return 0;
}
int main()
{
tItem *head = NULL;
WIN32_FIND_DATA FindFileData;
HANDLE hFind, hFind_2;
hFind = FindFirstFile("C:\Intel\*.*", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{ printf ("FindFirstFile failed (%d)\n", GetLastError());
return;}
else
{
while (FindNextFile(hFind, &FindFileData))
{
printf ("\n\nNext file found is %s\n", FindFileData.cFileName);
insert(FindFileData.cFileName, &head);
}
FindClose(hFind);
}
return 0;
}
输出为:
Next file found is ..
Node data: .., node next:0x0
Next file found is ExtremeGraphics
Node data: ExtremeGraphics, node next:0x330f80
Node data: ExtremeGraphics, node next:0x0
Next file found is Logs
Node data: Logs, node next:0x330fa0
Node data: Logs, node next:0x330f80
Node data: Logs, node next:0x0
我不知道为什么在 Logs 和 ExtremeGraphics,我不会在任何地方覆盖它。
感谢任何建议。
保存文件名时,您将指向链表中查找数据结构的 cFileName
成员的指针存储。所有列表元素都将指向那里。
此 cFileName
成员变量会被随后对 FindNextFile()
的调用用新找到的文件名覆盖。由于列表元素都指向那里,打印它们将重复打印姓氏。
要真正保存文件名,您必须在列表中存储 cFileName
的副本,例如使用 strdup()
.
你需要复制 x:
int insert(char *x, tItem **top){
tItem *temp = (tItem *)malloc(sizeof(tItem));
temp->data = strdup(x);
temp->next = *top;
*top = temp;
tItem *iterator;
iterator = *top;
while(iterator!=NULL){//display whole linked list
printf("\n\tNode data: %s, node next:0x%x\n", iterator->data, iterator->next);
iterator = iterator->next;
}
return 0;
}