先附上一份檔案讀寫操作:(今天一天頭都暈,快成豬腦子了^_^) //寫函數, #include<unistd.h> ssize_t write(int fd,const void *buf,size_t nbytes)); 傳回值:成功返回寫入檔案的位元組數,失敗返回-1 write函數向filedes檔案中寫入nbytes位元組資料,資料來源為buf.
ssize_t read(int fd,const void *buf,size_t nbytes); 傳回值:成功返回寫入的位元組數,0則碰到EOF。失敗返回-1 read函數從filedes檔案中讀取nbytes位元組資料,存放於buf中。
#include<fcntl.h> int open(const char *pathname,int oflag,mode_t mode) 返迴文件控制代碼 第一個參數是待開啟/建立的檔案的路徑名;oflag用於指定檔案的開啟/建立模式,這個參數可由以下常量通過邏輯構成。 O_RDONLY 唯讀模式 YcWLinux聯盟 O_WRONLY 唯寫模式 YcWLinux聯盟 O_RDWR 讀寫入模式YcWLinux聯盟 開啟/建立檔案時,至少得使用上述三個中的一個,搭配下面: O_APPEND 每次寫操作都寫入檔案的末尾 YcWLinux聯盟 O_CREAT 如果指定檔案不存在,則建立這個檔案 YcWLinux聯盟 O_EXCL 如果要建立的檔案已存在,則返回 -1,並且修改 errno 的值YcWLinux聯盟 O_TRUNC 如果檔案存在,並且以唯寫/讀寫方式開啟,則清空檔案全部內容 YcWLinux聯盟 O_NOCTTY 如果路徑名指向終端裝置,不要把這個裝置用作控制終端。YcWLinux聯盟 O_NONBLOCK 如果路徑名指向 FIFO/塊檔案/字元檔案,則把檔案的開啟和後繼 I/OYcWLinux聯盟 設定為非阻塞模式(nonblocking mode)
#include<stdio.h> #include<stdlib.h> #include<fcntl.h> #define N 10 typedef struct node { char name[20]; struct node *next; }stud; //將鏈表寫入檔案 stud * create(int n) { stud *p,*h,*s; int i; h=NULL; //經常忘記定義這裡,導致下面執行Segment fault!! for(i=0;i<n;i++) { if((s=(stud *)malloc(sizeof(stud)))==NULL) { printf("malloc space failed!\n"); exit(0);
} if(h==NULL) h=s; else p->next=s; printf("please enter name:"); scanf("%s",s->name); p=s; } s->next=NULL; return h; } void print(stud * head) { while(head) { printf("name:%s\n",head->name); head=head->next; } } //從檔案中讀出鏈表 stud * read_userman() { int fd,usersize,rc; stud *p1,*p2; stud temp; static stud head; usersize=sizeof(stud); fd=open("/tmp/user.txt",O_CREAT|O_RDONLY); if(fd<0) return; rc=read(fd,&temp,usersize); p1=&head; while(rc>0) { p1->next=(stud *)malloc(usersize); memcpy(p1->next,&temp,usersize); p1=p1->next; p1->next=NULL; memset(&temp,0,usersize); rc=read(fd,&temp,usersize); } close(fd); if(p1==&head) return NULL; return head.next; } int main() { stud *head; head=create(N); print(head); write_username(head); head=read_userman(); print(head); return 0; } //當頻繁讀取鏈表時,會引起程式錯誤。下面程式為一刪除N個資料,原來做法為刪一個寫入檔案,刪一個寫入檔案,頻繁操作,會引起程式進程死亡。所以做法改為 一次刪除N個資料,都是在記憶體中進行,直到刪除完全部資料,再寫迴文件。這樣就不會引起進程的死亡了。 int delete_sslclient_userman_memonry() { struct sslclient_userman first_userman,*userman,*pre_userman; FILE *fp; char usernum[10]; int id; userman=read_sslclient_userman_conf(); first_userman.next=userman; pre_userman=&first_userman; fp=fopen("/tmp/user.txt","r"); while(1) { if(fgets(usernum,10,fp)==NULL) break; id=atoi(usernum); while((userman->user_num!=id)&&(userman->next!=NULL)){ pre_userman=userman; userman=userman->next; }
if (userman->next==NULL) { pre_userman->next=NULL; write_sslclient_userman_conf(first_userman.next); return 1; } else { pre_userman->next=userman->next; }
userman=first_userman.next; } write_sslclient_userman_conf(first_userman.next);
return 0; } |