سلام:
برنامه کاربردی برای آموزش استفاده از فایل و Structها
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
struct address {
char name[30] ;
char street[30] ;
char city[20] ;
char state[3] ;
char zip[10] ;
struct address *next ;
struct address *prior ;
} list_entry ;
struct address *start ;
struct address *last ;
void enter() , display() , search() ;
void save() , load() , list() , del();
void display(struct address *info, int *row);
struct address *find(char *);
int menu_select();
struct address *store(struct address *, struct address *);
int main ()
{
start = last = NULL ;
for(;;) {
switch(menu_select()) {
case 1: enter(); break ;
case 2 : del(); break ;
case 3: list() ; break ;
case 4: search(); break ;
case 5: save(); break ;
case 6: load(); break ;
case 7: exit(0) ;
}//end of switch
}//end of for
}//end of main
//****************
int menu_select()
{
char s[5];
clrscr() ;
gotoxy(25, 4) ;
printf("1. enter a name ") ;
gotoxy(25, 6) ;
printf("2. delete a name ") ;
gotoxy(25, 8) ;
printf("3. list all files ") ;
gotoxy(25, 10) ;
printf("4. search ") ;
gotoxy(25, 12) ;
printf("5. save the file ") ;
gotoxy(25, 14) ;
printf("6. load the file ") ;
gotoxy(25, 16) ;
printf("7. quit ") ;
do {
gotoxy(20, 18) ;
printf("enter your select--www.gach18.blogfa.ir(1-7):");
gets(s);
} while (atoi(s) < 0 || atoi(s) > 7) ;
return atoi(s) ;
}
//*********************
void enter ()
{
struct address *info ;
int i ;
char ch ;
clrscr() ;
gotoxy(3, 2) ;
printf(" name street city state zip");
gotoxy(3, 3) ;
printf(" ------------ -------- ");
printf("-------- ----- ------- ");
i = 4 ;
for (;;) {
info = (struct address *)malloc(sizeof(list_entry)) ;
if(!info) {
printf("\n out of memory. press a key ") ;
getch();
return ;
}
gotoxy(3, i) ;
gets(info -> name) ;
if (!info -> name[0]) {
gotoxy(15, i + 1) ;
printf("press a key to continue");
getch() ;
break ;
}//end of if
gotoxy(18, i);
gets(info -> street) ;
gotoxy(28, i) ;
gets(info -> city) ;
gotoxy(38, i) ;
gets(info -> state) ;
gotoxy(45, i) ;
gets(info -> zip) ;
i++ ;
start = store(info, start) ;
} /* entry loop */
}
//**************
struct address *store(struct address *i, struct address *top)
{
struct address *old, *p ;
if(last == NULL) {
i -> next = NULL ;
i -> prior = NULL ;
start = i;
last = i ;
return i ;
}
p = top ;
old = NULL ;
while (p != NULL) {
if(strcmp(p -> name, i -> name) < 0) {
old = p ;
p = p -> next ;
}//end of if
else {
if (p -> prior) {
p -> prior -> next=i ;
i -> next=p ;
i -> prior=p -> prior;
p -> prior=i ;
return top ;
}//end of if
i -> next = p ;
i -> prior = NULL ;
p -> prior = i ;
return i ;
}//end of if
} // end of while
old -> next = i ;
i -> next = NULL ;
i -> prior = old ;
last = i ;
return start ;
}
//******************
void del()
{
struct address *info;
char name[80];
gotoxy(20, 20) ;
printf(" enter name for delete : ") ;
gets(name) ;
info = find(name) ;
if(info == NULL) {
gotoxy(10, 20) ;
printf(" name not found! press a key to continue.");
getch() ;
}
if (info)
if (start == info)
{
start = info -> next ;
if(start)
start -> prior = NULL ;
else
last = NULL ;
} //end of if
else {
info -> prior -> next = info -> next;
if(info != last)
info -> next -> prior = info -> prior;
else
last = info -> prior ;
} //end of else
free(info) ;
gotoxy(10,20) ;
printf("name deleted, press a key to continue.");
getch() ;
}
//*******************************
struct address *find(char *name)
{
struct address *info ;
info = start ;
while(info != NULL) {
if (strcmp(name, info -> name) == 0)
return info;
info = info -> next ;
}
return NULL ;
}
//*****************
void list ()
{
struct address *info ;
int i ;
info = start ;
clrscr() ;
gotoxy(3, 2) ;
printf(" name street city state zip");
gotoxy(3, 3) ;
printf(" ------------ -------- -");
printf("------- ----- ------- ");
i = 4 ;
while(info != NULL) {
display(info, &i) ;
info = info -> next ;
}
gotoxy(15, i + 2) ;
printf("press a key to continue.");
getch() ;
}
//*******************
void display(struct address *info, int *row)
{
gotoxy(3, *row) ;
printf("%s", info -> name) ;
gotoxy(18, *row) ;
printf("%s", info -> street) ;
gotoxy(28, *row) ;
printf("%s", info -> city) ;
gotoxy(38, *row) ;
printf(info -> state) ;
gotoxy(47, *row) ;
printf(info -> zip) ;
*row = *row + 1 ;
}
//**************************
void search()
{
char name[40] ;
int i ;
struct address *info;
gotoxy(20, 20) ;
printf(" enter name to find : ");
gets(name) ;
info = find(name) ;
if(info == NULL) {
gotoxy(10, 20) ;
printf(" name not found! press a key to continue.");
getch() ;
}//end of if
else {
clrscr() ;
gotoxy(3, 2) ;
printf(" name street city state zip");
gotoxy(3, 3) ;
printf(" ------------ -------");
printf("- -------- ----- ------- ") ;
i = 4 ;
display(info ,&i) ;
gotoxy(15, i + 2) ;
printf("press a key to continue.");
getch() ;
}//end of else
}
//*********************
void save()
{
struct address *info ;
FILE *fp ;
if((fp = fopen("l.dat","wb")) == NULL) {
printf("\n cannot open file. ") ;
getch();
exit(1) ;
}//end of if
gotoxy(20, 20) ;
printf("<< saving file >>") ;
info = start ;
while(info) {
fwrite(info, sizeof(struct address), 1, fp);
info = info -> next ;
}//end of while
fclose(fp) ;
gotoxy(15, 22) ;
printf("file successfuly saved press a key...") ;
getch() ;
}
//********************
void load ()
{
struct address *info , *temp = NULL;
FILE *fp ;
fp = fopen("l.dat","rb") ;
if(fp == NULL) {
printf("\n cannot open file.");
getch();
exit(1) ;
}
while(start) {
info = start -> next ;
free(info) ;
start = info ;
}
gotoxy(20,20) ;
printf(" << loading file >> ") ;
start = NULL ;
while (!feof(fp)) {
info = (struct address *)
malloc(sizeof(struct address)) ;
if(1 != fread(info, sizeof(struct address), 1, fp))
break ;
if(start == NULL) {
temp = start = info ;
info -> prior = NULL ;
info -> next = NULL ;
}//end of if
else {
info -> next = NULL ;
temp -> next = info ;
info -> prior = temp ;
temp = info;
}
}//end of while
last = temp ;
fclose(fp) ;
gotoxy(15,22) ;
printf("file successfuly loaded press a key ...") ;
getch();
}
---------------------------------------------------------------------------