【轉】C鏈表寫入檔案,讀出檔案操作

來源:互聯網
上載者:User

轉載自  wuhuang040924

先附上一份檔案讀寫操作:(今天一天頭都暈,快成豬腦子了^_^)


//寫函數,
#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;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.