Linux C高级编程——文件操作之库函数
Linux C高級編程——文件操作之庫函數
宗旨:技術的學習是有限的,分享的精神是無限的
——為什么要設計標準I/O庫?
直接使用API進行文件訪問時,需要考慮許多細節問題
例如:read、write時,緩沖區的大小該如何確定,才能使效率最優
標準I/O庫封裝了諸多細節問題,包括緩沖區分配
?
——標準I/O庫緩沖
標準I/O庫提供緩沖的目的:盡可能減少使用read、write調用的次數,以提高I/O效率。
通過標準I/O庫進行的讀寫操作,數據都會被放置在標準I/O庫緩沖中中轉。
?
——緩沖類型
—全緩沖
在填滿標準I/O緩沖區后,才進行實際I/O操作(例如調用write函數)
調用fflush函數也能強制進行實際I/O操作
—行緩沖
在輸入和輸出遇到換行符時,標準I/O庫執行I/O操作
因為標準I/O庫用來收集每一行的緩存的長度是固定的,所以,只要填滿了緩存,即使沒有遇到新行符,也進行I/O操作
終端(例如標準輸入和標準輸出),使用行緩沖
—不帶緩沖
標準I/O庫不對字符進行緩沖存儲
標準出錯是不帶緩沖的,為了讓出錯信息盡快顯示出來
?
——流的定向
對于ASCII字符集,一個字符用一個字節表示
對于國際字符集,一個字符可用多個字節表示
流的定向決定了所讀、寫的字符是單字節還是多字節的?
?
一、打開關閉文件
1、fopen
——用于打開一個指定的文件
(1)函數原型
#include<stdio.h> FILE* fopen(const char *restrict pathname, const char *restrict type);(2)參數
? ? ? ? pathname:要打開的文件名
? ? ? ? type:指定文件的讀、寫方式
r/rb——只讀方式打開
w/wb——只寫,不存在則創建,使文件長度為0
a/ab——追加
r+/r+b/rb+——讀寫打開
W+/w+b/wb+——使文件長度為0,讀寫而打開
a+/a+b/ab+——在文件尾讀和寫而打開或創建
(3)返回值
? ? ? ? ——FILE結構指針(open返回的是文件描述符)
?
2、fflush
——刷新一個流(強制標準I/O庫進行系統調用,以將數據傳遞到內核)
(1)函數原型
int fflush(FILE *fp);(2)函數參數
? ? ? ? fp:文件指針;若fp=NULL,則刷新所有輸出流
(3)返回值
? ? ? ? 成功返回0,出錯返回EOF
?
3、fclose
——關閉一個打開了的流
(1)函數原型
int fclose(FILE *fp);(2)函數參數和返回值
? ? ? ? ? fp:要關閉的流對應的文件指針
(3)返回值
? ? ? ? ?—成功返回0,出錯返回EOF
? ? ? ? ?在該文件被關閉之前,刷新緩存中的輸出數據。緩存中的輸入數據被丟棄,如果標準I/O庫已經為該流自動分配了一個緩存,則釋放此緩存。
?
二、讀寫文件流
1、字符讀/寫文件流
1.1、fgetc
——讀出流中的一個字符
(1)函數原型
int fgetc(FILE *fp);(2)函數參數
? ? ? ? fp:文件指針
(3)返回值
? ? ? ? 成功返回讀到的內容; 出錯返回-1。
1.2、fputc
——寫一個字符到文件流中
(1)函數原型
int fputc(int c, FILE *fp);(2)函數參數
? ? ? ? c:字符c
? ? ? ? fp:文件指針
(3)返回值
? ? ? ? 成功返回內容; 出錯返回-1
2、行讀寫文件流(一行一行進行)——不能操作二進制文件
2.1、fgets
——讀出流中的一行字符串
(1)函數原型
char *fgets(char *s, int n, FILE *fp);(2)函數參數
? ? ? ? ?s:字符串指針,指向用來存儲所得數據的地址
? ? ? ? ?n:緩沖區大小
? ? ? ? fp:文件指針
(3)返回值
? ? ? ? 成功返回讀到的內容到s中; 出錯返回NULL。
2.2、fputs
——寫一行字符串到標準流中
(1)函數原型
int *fputs(char*s, FILE *fp);(2)函數參數
? ? ? ? s:以空字符結尾的字符串(后接換行符)寫入標準流stdout中
? ? ? ? fp:文件指針
(3)返回值
? ? ? ? 成功返回非負數; 出錯返回-1。
3、塊讀寫文件流?(fread/fwrite)
——每次I/O操作讀寫某種數量的對象,而每個對象具有指定的長度
例如,可讀寫一個二進制數組、結構
(1)函數原型
size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp); size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);(2)參數
? ? ? ? 第一個參數ptr:用于讀寫的緩沖區
? ? ? ? 第二個參數size:每個對象的大小
? ? ? ? 第三個參數nobj:要讀寫的對象個數
? ? ? ? 第四個參數fp:文件指針
(3)返回值
? ? ? ? 返回實際讀/寫的對象數
三、文件流定位
1、ftell
——用于獲取當前文件偏移量
(1)函數原型
long ftell(FILE *fp);(2)函數參數
? ? ? ? ?fp:文件指針
(3)返回值
? ? ? ? 成功返回當前文件偏移量; 出錯返回-1。
?
2、fseek
——用于設置當前文件偏移量
(1)函數原型:
int fseek(FILE *fp, long offset, int whence);(2)函數參數
? ? ? ? 第一個參數fp:文件指針
? ? ? ? 第二個參數offset:相對偏移量:需結合whence才能計算出真正的偏移量
? ? ? ? 第三個參數whence:該參數取值是三個常量
SEEK_SET: 當前文件偏移量為:距文件開始處的offset個字節??
SEEK_CUR: 當前文件偏移量為:當前文件偏移量+offset(可正可負)???????????????????????
SEEK_END: 當前文件偏移量為:當前文件長度+offset(可正可負) ?
(3)返回值
? ? ? ? 成功返回0,出錯返回非0? ? ?
?????????????????????????
3、rewind??????????????????????????????????
—— 用于將文件偏移量設置到文件的起始位置????
(1)函數原型
void rewind(FILE *fp);(2)函數參數
? ? ? ? fp:文件指針?
(3)返回值
無
// 小程序:用標準庫函數實現文件拷貝功能: #include<stdio.h> //#include<string.h> #include<stdlib.h>void file_copy(char *fd, char *fp);int main(intargc, char **argv) {file_copy(argv[1], argv[2]);return 0; }void file_copy(char *fd, char *fp) {FILE *from_fd, *to_fd;int ret, file_len; //定義文件大小char buffer[1024];//緩沖區if((from_fd = fopen(fd, "rb")) == NULL) //打開目標文件{printf("file openfail!\n");exit(1);}if((to_fd = fopen(fp, "wb")) == NULL) //創建新文件{printf("file openfail!\n");exit(0);}fseek(from_fd, 0L, SEEK_END);file_len = ftell(from_fd);//計算文件大小fseek(from_fd, 0L, SEEK_SET);if((ret = fread(buffer, file_len, 1, from_fd)) == -1) //讀取文件到buffer中,返回實際讀到的對象個數(不是讀取的字節數){printf("file readfail!\n");exit(0);}//printf("!!!!!!!!!!!%d\n",ret);fwrite(buffer, file_len, 1, to_fd); //把buffer里面的內容寫到新文件中fclose(from_fd);fclose(to_fd);//關閉文件 }總結
以上是生活随笔為你收集整理的Linux C高级编程——文件操作之库函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试技术之如何编写测试用例
- 下一篇: 机器学习——超参数调优