回复 5楼 embed_xuel
pr=pr->next;这一句删了
2012-04-04 11:15
2012-04-04 11:27
2012-04-04 11:29

2012-04-04 13:04
2012-04-04 13:06
2012-04-04 17:01
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <conio.h>
struct clerk
{
char clerkNum[10];
char name[20];
int age;
char position[10];
double salaries;
struct clerk* next;
};
const char file_name[] = "e:\\Projects\\test\\test_Clerk\\clerk.dat";
void init_data(const char* file_name);
void print_data(const clerk* data);
bool save_data(const char* file_name, const clerk* data, const int count);
clerk* load_data(const char* file_name);
void release(clerk* data);
void main(void)
{
// 初始化测试数据
// init_data(file_name);
// 从文件中读入链表数据并输出
clerk* data = load_data(file_name);
clerk* p = data;
while (p != NULL)
{
print_data(p);
p = p->next;
}
_getch();
release(data);
data = NULL;
}
void init_data(const char* file_name)
{
const clerk data[] =
{
{ "001", "lusvan", 20, "beijing", 3000.0, NULL },
{ "002", "hellovfp", 30, "shanghai", 5000.0, NULL },
{ "003", "embed_xuel", 28, "shenyang", 5000.0, NULL }
};
save_data(file_name, data, _countof(data));
}
void print_data(const clerk* item)
{
printf_s(" Num: %s\n", item->clerkNum);
printf_s(" Name: %s\n", item->name);
printf_s(" Age: %d\n", item->age);
printf_s("Position: %s\n", item->position);
printf_s("Salaries: %.2f\n", item->salaries);
printf_s("\n");
}
bool save_data(const char* file_name, const clerk* data, const int count)
{
bool success = false;
FILE* file;
if (fopen_s(&file, file_name, "wb") == 0)
{
success = true;
for (int i = 0; i < count; ++i)
{
if (fwrite(&(data[i]), sizeof(clerk), 1, file) != 1)
{
success = false;
break;
}
}
fclose(file);
}
else
{
printf_s("Data file open error!\n");
}
return success;
}
clerk* load_data(const char* file_name)
{
clerk* head = NULL; // 链头
FILE* file;
if (fopen_s(&file, file_name, "rb") == 0)
{
clerk item; // 中介数据项
clerk* p = NULL; // 当前结点指针
clerk* previous = NULL; // 前项结点指针
bool first = true;
while (fread(&item, sizeof(clerk), 1, file) == 1) // 从文件中读入一笔记录
{
if ((p = (clerk *)malloc(sizeof(clerk))) != NULL) // 申请结点内存空间
{
memcpy(p, &item, sizeof(clerk)); // 把读入的数据项复制给当前结点
p->next = NULL; // 初始化下项指针
if (previous != NULL)
{
previous->next = p; // 如果有前项,则令前项的下结点指针指向当前结点
}
previous = p; // 令当前结点成为下一项的前项
if (first)
{
head = p; // 如果这是第一笔记录,则它是链表头,用于返回作为链表的入口
first = false;
}
}
else
{
break;
}
}
fclose(file);
}
return head; // 返回链表头
}
void release(clerk* data)
{
clerk* next = NULL;
while (data != NULL)
{
next = data->next;
free(data);
data = next;
}
}

2012-04-04 18:42