1. 文件編程函數介紹

如果在Linux系統下學習C語言,就會了解到兩套文件編程接口函數:
C語言標準的文件編程函數: fopen、fread、fwrite、fclose
Linux下提供的文件編程函數: open、read、write、close
傳參的區別:
基于文件指針: fopen fclose fread fwrite 比較適合操作普通文件。
基于文件描述符: open close read write 比較適合操作設備文件。
2. C語言標準庫提供的文件編程函數
下面介紹C語言標準庫提供的文件編程函數,一般對文件常用的操作就是:創建(打開)、讀、寫、關閉。
其他的函數用法同理,只要把這4個函數學會了,基本的文件操作已經可以完成了。
#include FILE *fopen(const char *path, const char *mode); 函數功能: 打開或者創建文件 函數參數: const char *path 填文件的路徑 const char *mode 填權限。比如: wb rb a+b 函數返回值: 文件打開或者創建成功返回對應的文件指針. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 函數功能: 讀文件 函數參數: void *ptr :讀取數據存放的緩沖區。 size_t size :每次讀取的大小 size_t nmemb :每次讀取的次數 FILE *stream :讀取文件 返回值: 讀取成功的次數。 比如: fread(buff,1,1000,fp); 從fp文件里讀取1000個字節的數據到buff里。 size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); 函數功能: 寫文件 函數參數: void *ptr :將要寫入的數據緩沖區首地址。 size_t size :每次寫入的大小 size_t nmemb :每次寫入的次數 FILE *stream :寫入的文件 返回值: 寫入成功的次數。 比如: fwrite(buff,1,1000,fp); 向fp文件里寫1000個字節的數據,數據從buff里獲取。 int fclose(FILE *fp); 函數功能: 關閉打開的文件。
3. Linux下的系統函數: 文件編程函數
Linux下也有一套系統函數,用于文件操作,這些函數在Linux下常用于讀寫設備文件;當然,讀寫普通文件也是一樣,普通文件也是磁盤上的數據,也是操作塊設備驅動。
#include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 函數功能: 打開或者創建文件 函數參數: const char *pathname : 文件的路徑 int flags :打開文件的權限. 比如: O_RDONLY O_WRONLY O_RDWR O_CREAT mode_t mode :創建文件時指定文件本身的權限. 比如: S_IRWXU 00700 user (file owner) has read, write and execute permission S_IRUSR 00400 user has read permission S_IWUSR 00200 user has write permission S_IXUSR 00100 user has execute permission S_IRWXG 00070 group has read, write and execute permission S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 others have read, write and execute permission S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permission S_IXOTH 00001 others have execute permission 返回值: (返回文件描述符--小整數)文件打開成功值>=0 否則<0 示例: open("123.c",O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO); 創建一個123.c的新文件,并且指定該文件的權限是最高權限. chmod 777 123.c一樣 ssize_t read(int fd, void *buf, size_t count); 函數功能: 讀文件 函數參數: int fd :文件描述符. ---表示已經打開的文件。 void *buf :讀取數據存放的緩沖區. size_t count :讀取字節數量. 返回值: 成功讀取的字節數量. ssize_t write(int fd, const void *buf, size_t count); 函數功能: 寫文件 函數參數: int fd :文件描述符. ---表示已經打開的文件。 void *buf :將要寫入到文件的數緩沖區首地址. size_t count :寫入的字節數量. 返回值: 成功寫入的字節數量. int close(int fd); 函數功能: 關閉已經打開的文件.
4. 案例: 實現文件拷貝功能(fopen)
例如: cp 123.c 456.c 將123.c的數據拷貝到456.c文件里。
注意: 下面這個代碼需要在命令行上運行,需要給main函數傳參。如果是在windows下IED軟件里運行,可以將傳參代碼屏蔽掉,改成讓用戶輸入,或者直接把參數固定也可以。
#include //實現: cp 123.c 456.c int main(int argc,char **argv) { if(argc!=3) { printf("參數: ./a.out <源文件> <目標文件>\n"); return 0; } /*1. 打開源文件*/ FILE *src_fp=fopen(argv[1],"rb"); if(src_fp==NULL) { printf("%s 文件打開失敗.\n",argv[1]); return -1; } /*2. 創建新文件*/ FILE *new_fp=fopen(argv[2],"wb"); if(new_fp==NULL) { printf("%s 文件創建失敗.\n",argv[2]); fclose(src_fp); return -2; } /*3. 實現文件的拷貝*/ unsigned char buff[1024]; unsigned int cnt; while(1) { cnt=fread(buff,1,1024,src_fp); fwrite(buff,1,cnt,new_fp); if(cnt!=1024)break; } /*4. 關閉文件*/ fclose(new_fp); fclose(src_fp); return 0; }
5. 案例: 實現文件拷貝功能(open)
例如: cp 123.c 456.c 將123.c的數據拷貝到456.c文件里。
#include #include #include #include //實現: cp 123.c 456.c int main(int argc,char **argv) { if(argc!=3) { printf("參數: ./a.out <源文件> <目標文件>\n"); return 0; } /*1. 打開源文件*/ int fd_src=open(argv[1],O_RDONLY); if(fd_src<0) { printf("源文件打開失敗.\n"); return -1; } /*2. 創建新文件*/ int fd_new=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if(fd_new<0) { printf("新文件創建失敗.\n"); close(fd_src); return -2; } /*3. 拷貝文件*/ unsigned char buff[1024]; int cnt; while(1) { cnt=read(fd_src,buff,1024); write(fd_new,buff,cnt); if(cnt!=1024)break; } /*4. 關閉文件*/ close(fd_src); close(fd_new); return 0; }
C 語言 Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。