什么是平臺內(nèi)部營銷論壇seo設(shè)置
一、C中文件操作簡介
? ? ? ? c中的文件操作大致和linux的文件操作類似,但是畢竟是不同的API,所以會有些差異。部分差異會在下面的案例中體驗(yàn)
二、fopen
????????open的參數(shù)有兩個一個是文件名,一個是模式選擇,不同open函數(shù),open中的模式是一個枚舉mode_t, 這里的mode類型是一個字符中。
#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);
open參數(shù)描述
pathname | 文件路徑 |
mode | 模式,設(shè)置權(quán)限 |
mode
r | 以只讀方式打開文件 |
r+ | 以讀寫方式打開文件 |
w | 清空文件或創(chuàng)建文件 |
w+ | 以讀寫方式打開文件,文件不存在會創(chuàng)建,如果存在會被截?cái)?/td> |
a | 以追加形式打開文件,文件不存在會創(chuàng)建,只能將內(nèi)容添加到尾部 |
a+ | 以讀寫方式打開文件,并在文件后面追加,文件不存在會創(chuàng)建 |
?返回值
? ? ? ? 指向文件流的FILE *指針類型,失敗返回NULL
?fopen 和open flag 轉(zhuǎn)換表
三、close
close 比較簡單,參數(shù)只一個打開的文件的描述符。成功返回0,失敗返回EOF。
#include <stdio.h>int fclose(FILE *stream);
四、read
read函數(shù)嘗試從stream 中 讀取nmemb條數(shù)據(jù),每條數(shù)據(jù)的大小為size,并把讀取的數(shù)據(jù)放在ptr指針中。所以讀取的數(shù)據(jù)大小 為 nmemb * size。
如果讀取成功返回nmemb;?
如果nmemb * size 超過文件的大小,返回的nmemb大小等于剛超過文件大小的值。比如文件中只有12345,size設(shè)置成3,nmemb如果設(shè)置成2,則返回2,如果設(shè)置超過2,也只能返回2。
nmemb: 可以理解為number of member block, 內(nèi)存塊的數(shù)量
#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
五、write
write函數(shù)嘗試向stream 中寫入nmemb條數(shù)據(jù),每條數(shù)據(jù)的大小為size,寫入的數(shù)據(jù)放在ptr指針中。所以寫入的數(shù)據(jù)大小為 nmemb * size。
如果寫入成功返回nmemb;
如果nmemb * size 超過ptr緩沖區(qū)大小也能寫入成功,也會返回nmemb。
#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
六、lseek
重定位光標(biāo)的位置。根據(jù)設(shè)置whence 來進(jìn)行offset偏移,offset為負(fù)代碼左偏移,為正代表右偏移。
成功返回0,失敗返回-1; 通過調(diào)用ftell來獲取當(dāng)前光標(biāo)的位置。而不是像lseek直接返回光標(biāo)的位置。
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
常用 whence
SEEK_SET | 定位到文件起始位置 |
SEEK_CUR | 定位到當(dāng)前位置 |
SEEK_END | 定位到文件結(jié)束位置 |
七、自定cp命令
argc: 代表參數(shù)數(shù)量 argument count?
argv :代表argument vector ,是一個指針數(shù)組(數(shù)組元素類型是char *),或者說是一個二級指針(char **argv)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main(int argc, char *argv[]) {FILE *src, *des;char *readBuf = NULL;if(argc != 3) {printf("paramer error\n");exit(-1);}src = fopen(argv[1], "r");fseek(src, 0, SEEK_END);int size = ftell(src);fseek(src, 0, SEEK_SET);printf("size = %d", size);readBuf = (char *)malloc(sizeof(char) * size + 1);int readCount = fread(readBuf, size, 1, src);des = fopen(argv[2], "w+");fwrite(readBuf, strlen(readBuf), 1, des);fclose(src);fclose(des);return 0;
}