1. 程式人生 > >open、write、read函式及應用

open、write、read函式及應用


#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;
}