open、write、read函式及應用
阿新 • • 發佈:2018-12-21
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> typedef struct students { int num; char name[20]; struct students *next; }Stu,*PStu; PStu head=NULL; PStu r; //-----寫入連結串列----- void creat_list(PStu *phead,PStu r)// 需要把讀取到的最後一個節點指標傳參進來 { PStu ptr; char choose; int num; char name[20]; while(1) { printf("do you want to add a student?(y or else)\n"); scanf("%c",&choose);getchar(); if(choose=='y') { ptr=malloc(sizeof(Stu)); printf("id="); scanf("%d",&num);getchar(); printf("name="); scanf("%s",name);getchar(); ptr->num=num; strcpy(ptr->name,name); ptr->next=NULL; if(*phead==NULL)//如果沒有讀取到,則從頭開始建立 { *phead=ptr; } else r->next=ptr; r=ptr; } else if(choose!='y') break; } } //-----列印函式----- void printf_list(PStu ptr) { while(ptr!=NULL)//無頭節點 { printf("%d\t%s\n",ptr->num,ptr->name); ptr=ptr->next; } } //-------讀檔案------ PStu read_file(PStu *head) { int fd; int ret; PStu p,r; fd=open("./stu.txt",O_CREAT|O_RDONLY,00700); if(fd<0) { perror("open");exit(0); } else { while(1) { p=malloc(sizeof(Stu)); ret=read(fd,p,sizeof(Stu));//從檔案中讀取內容存在(節點)指標中 if(ret<0) { perror("read");break; } if(ret==0)//read返回值為0時結束 { printf("-------read over------\n"); break; } if(ret>0)//read返回值>0時迴圈讀取並往後移動 { p->next=NULL; if(*head==NULL) { *head=p; } else r->next=p; r=p; } } } close(fd);return r;//返回讀取到的最後一個節點指標 } //-----寫檔案------ void write_file(PStu p) { /* read_file(PStu *ptr);*/ int fd; int ret; fd=open("./stu.txt",O_WRONLY); if(fd<0) { perror("open"); return ; } for(;p!=NULL;p=p->next) { ret=write(fd,p,sizeof(Stu)); if(ret<0) perror("write"); } close(fd); } //------主函式----- int main() { r=read_file(&head);//得到所讀取到的最後一個節點指標 PStu p; creat_list(&head,r); write_file(head); if(head==NULL) printf("無學生\n"); else { printf("學號\t姓名\n"); printf_list(head); } return 0; }