文件編程簡述

一、Linux下的文件系統
1.1 文件系統概述:操作系統在磁盤或分區上用來存儲和管理文件的子系統。
作用:向用戶提供了對底層硬件數據訪問的機制。
Linux可以支持多文件系統是通過虛擬文件系統(Virtual File System)VFS來實現的。VFS只存在於系統的內存中,在系統啓動調入內存,系統關閉調出內存。

1.2 文件和目錄特性
在Linux下所有的軟件和硬件都被稱爲文件。
文件分爲5種:普通文件、目錄文件、鏈接文件、設備文件和管道文件。

1.3 VFS基本數據結構
超級塊結構(struct super_block):存放已安裝的的文件系統的相關信息。
索引點結構(struct inode):存放有關具體文件的一般信息。
文件結構(struct file):存放進程中打開的文件相關信息。
目錄項結構(struct dentry):存放有關路徑名及路徑名所指向的文件的信息。

二、標準文件操作
C語言提供的文件描述符的概念,通過文件描述符與底層文件相關聯,個函數通過文件描述符來對文件進行操作。
1.1 底層文件操作函數
1、open()函數
函數原型:int open(const char *pathname,int flags,mode_t mode);
返回值:打開文件成功,返回唯一的文件描述符(read()和write()函數通過文件描述符對文件進行操作);打開失敗,返回-1原因記錄在全局變量errno中。
(只有選擇flags參數的O_CREAT,參數mode纔有效)
2、close()函數
函數原型:int close(int fd);
函數說明:關閉文件描述符fd指定的文件,將數據寫回磁盤,並釋放該文件所佔的內存資源。成功返回0,失敗返回-1。
錯誤代碼:EBADF,表示參數fd不是有效的文件描述符,或該文件已關閉
3、read()函數
函數原型:size_t read(int fd, void *buf, size_t count);
返回值:函數成功,返回實際讀取的字節數;若返回0,說明表示到達文件尾或沒有字符可讀取;返回值小於count,其他原因。
錯誤代碼:
4、write()函數
函數原型:size_t write(int fd, const void *buf, size_t count);
返回值:成功,返回寫入的字節數,(0代表沒有寫入數據);失敗,返回-1,原因記錄在errno變量中。
錯誤代碼:
5、ioctl()函數
頭文件:#include

#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

void main()
{
    int fd,size;
    char s[]="This is a linux programe!\n",buffer[50];
    fd=open("temp.txt",O_WRONLY|O_CREAT|O_EXCL);
    write(fd,s,sizeof(s));
    close(fd);
    fd=open("temp.txt",O_RDONLY);
    size=read(fd,buffer,sizeof(buffer));
    close(fd);
    printf("%s",buffer);
}

二、標準文件操作函數
1、文件打開與關閉函數
1).fopen()函數
函數原型:FILE *fopen(const char *path, const char *mode);
函數說明:fopen()函數以mode方式打開參數path指向的文件。
mode打開方式:r r+ w w+ a a+.

#include<stdio.h>

int main()
{
    FILE *fp;
    fp=fopen("temp.txt","a+");
    if(fp == NULL)
        return 0;
    else
        printf("open file succeeded!\n");
    fclose(fp);
}

2).fclose()函數
函數原型:int fclose(FILE *stream);
返回值:成功返回0;否則返回EOF,錯誤記錄在全局變量errno中。
錯誤代碼EBADF,表示參數stream不指向已打開的文件。
2.文件的讀寫函數
1)、fread()函數
函數原型:size_t fread(void *ptr , size_t size, size_t nmemb,FILE *stream);
返回值: 成功返回讀取單元個數;若指針到達文件尾,返回一個小於nmemb的數;失敗返回0。
2)、fwrite()函數
函數原型:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
返回值: 成功返回讀取單元個數;若指針到達文件尾,返回一個小於nmemb的數;失敗返回0。

#include<stdio.h>

void main(void)
{
    FILE *ptr;
    int i, numread, numwritten, length;
    length=20;
    char data[length];

    if((ptr = fopen("test.txt", "w+"))!=NULL)
    {
        for(i=0; i<length; i++)
            data[i]='a'+i;
        numwritten = fwrite(data, sizeof(char), length,ptr);
        printf("Wrote %d words\n", numwritten);
        fclose(ptr);
    }
    else
        printf("Open file failed!\n");

    if((ptr = fopen("test.txt", "r+"))!=NULL)
    {
        numread=fread(data,sizeof(char),length,ptr);
        printf("%s\n",data);
        printf("read %d words\n",numread);
        fclose(ptr);
    }
    else
        printf("can't open the file!\n");
}

3、 讀寫文件字符函數
1)fgetc()函數
函數原型:int getc(FILE *stream);
函數說明:fgetc()函數從參數stream所指向的文件中讀取一個字符。
返回值:成功返回讀取的字符;若達到文件尾,則讀取失敗,返回EOF。
2)、fputc()函數
函數原型:int fputc(int c,FILE *stream);
函數說明:fputc()函數將字符c轉爲unsigned char 後寫入參數stream指向的文件。
返回值:成功返回讀取的字符,失敗返回EOF。
3)fgets()函數
函數原型:char *fgets(char *s, int size, FILE *stream);
返回值:成功返回指針s;錯誤返回NULL。
4)fputs()函數
函數原型:int fputs(const char *s,FILE *stream);
函數說明:將參數s指向的字符串寫入參數stream指向的文件中,’\0’不寫入。
返回值:成功返回寫入文件的字符個數;否則返回EOF。
1)remove()函數
函數原型:int remove(const char *pathname);
返回值:成功返回0;失敗返回-1,錯誤代碼放在errno中。
錯誤代碼:
2)rename()函數
函數原型:int rename(const char *oldpath,const char *newpath);
返回值:成功返回0;失敗返回-1,錯誤代碼放在errno中。
錯誤代碼:

#include<stdio.h>

int main()
{
    int flag;
    char old[]="temp.txt";
    char new[]="/root/sxy/new.txt";

    flag=rename(old,new);
    if(flag==0)
        printf("succeed\n");
    else
        printf("failed\n");
}

5、access()函數
函數原型:int access(const char *pathname, int mode);
函數說明;檢查進程是否有讀寫權限,參數mode的F_OK判斷文件是否存在。

三、目錄操作
1.目錄數據結構
struct dirent
{
ino_ t d_ino; //索引節點
ff_t d_off; //目錄文件開頭到此目錄進入點的位移
signed short int d_reclent; //目錄項名稱長度
unsigned char d_type; //所指文件的類型
char d_name[256]; //文件名
}
2、目錄文件的創建mkdir()函數
函數原型:int mkdir(const char *pathname,mode_t mode);
函數說明:函數以mode方式創建一個參數pathname命名的目錄,mode定義新創建的目錄的權限。
返回值:成功返回0;失敗返回-1,錯誤代碼放在errno中。
錯誤代碼:
3、目錄刪除函數rmdir()
函數原型:int rmdir(const char *pathname);
函數說明:用來刪除一個目錄,該目錄必須爲空。
返回值:成功返回0;失敗返回-1,錯誤代碼放在errno中。
錯誤代碼:

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>

int main()
{
    int sign;
    char pathname[]="root/syx/temp";
    sign=mkdir(pathname,O_RDWR);
    if(sign==0)
        printf("craete succeed!\n");
    else
        printf("craete failed!\n");
    sign=rmdir(pathname);
    if(sign==0)
        printf("delete succeed!\n");
    else
        printf("delete failed\n");
    return 1;
}

4、目錄打開函數opendir()
        函數原型:DIR *opendir(const char *name);
        函數說明:打開參數name指向的目錄,參數name指向該目錄的入口地址。
        返回值:打開成功,返回一個指向目錄流的指針;否則返回NULL。
        錯誤代碼:
5、目錄文件讀取函數readdir()
        函數原型:struct dirent *readdir(DIR *dir);
        函數說明:返回一個結構體dirent型的指針,該指針指向下一個目錄的入口地址。
        返回值:成功返回一個結構體dirent型的指針;錯誤或指向文件尾,返回NULL。
        錯誤代碼:EBADF,說明dir是一個無效的目錄流。
6、目錄關閉函數closedir()
        函數原型:int closedir(DIR *dir);
        返回值:成功返回0;否則返回-1。
        錯誤代碼:EBADF,說明dir是一個無效的目錄流。

include

include

include


7、目錄屬性設置函數chmod()
        函數原型:int chmod(const char *path,mode_t mode);
        函數說明:以mode方式改變參數path指向文件的權限。
        返回值:成功返回0;失敗返回-1,錯誤代碼放在errno中。
        錯誤代碼:
8、目錄屬性讀取函數getcwd()
        函數原型:char *getcwd(char *buf,size_t size);
        函數說明:將當前工作目錄的絕對路徑存儲到字符數組buf所在的內存中,數組長度爲size。
        返回值:成功返回buf的指針;否則返回NULL。
        錯誤代碼:

include

include

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章