FILE * fopen(const char * path,const char * mode);
- 所需庫: <stdio.h>
返回值
- FILE是C語言定義的標准數據結構,如果open()失敗,則返回NULL
path
- 路徑
mode
- 打開模式,包括有以下幾種
- r 以只讀方式打開文件,該文件必須存在。
- r+ 以讀/寫方式打開文件,該文件必須存在。
- rb+ 以讀/寫方式打開一個二進制文件,只允許讀/寫數據。
- rt+ 以讀/寫方式打開一個文本文件,允許讀和寫。
- w 打開只寫文件,若文件存在則長度清為 0,即該文件內容消失,若不存在則創建該文件。
- w+ 打開可讀/寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。
- a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留(EOF 符保留)。
- a+ 以附加方式打開可讀/寫的文件。若文件不存在,則會建立該文件,如果文件存在,則寫入的數據會被加到文件尾后,即文件原先的內容會被保留(原來的 EOF 符不保留)。
- wb 以只寫方式打開或新建一個二進制文件,只允許寫數據。
- wb+ 以讀/寫方式打開或建立一個二進制文件,允許讀和寫。
- wt+ 以讀/寫方式打開或建立一個文本文件,允許讀寫。
- at+ 以讀/寫方式打開一個文本文件,允許讀或在文本末追加數據。
- ab+ 以讀/寫方式打開一個二進制文件,允許讀或在文件末追加數據。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
返回值
- fread()和fwrite()返回的是成功讀取/寫入的條目數(也就是nmemb大小),如果到達文件末尾或讀寫錯誤,則返回0
ptr
- 指針pointer,用來讀出或寫入的數據區
size
- 單個數據項的大小,單位為字節
nmemb
- 讀寫的條目數(實際等於讀寫字節大小 )
PS:盡量將size大小寫為最小值(1字節)
int fprintf(FILE *stream, const char *format, ...)
- 將內容輸出到文件中,比如:fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);,此時的文件中便有了: We are in 2014
int fclose(FILE *stream);
- 關閉流 stream,刷新緩沖區,更新文件
示例1:
#include<string.h> #include<stdio.h> int main(void) { FILE *fp = NULL; const char *buf = "0123456789"; fp = fopen("DUMMY.FIL","w");/*創建一個包含10個字節的文件*/ fwrite(buf,strlen(buf),1,fp);/*將buf內容寫入到文件中*/ fclose(fp);/*關閉文件*/return 0; }
int fseek(FILE *stream, long offset, int fromwhere);
返回值
- 成功,返回0,失敗返回-1,並設置error的值
offset
- 偏移量,正數表示正向偏移,負數表示負向偏移,單位為字節
Fromwhere
- 偏移起始位置,有3種位置:
- SEEK_SET(0): 文件開頭
- SEEK_CUR(1): 當前位置
- SEEK_END(2): 文件結尾
示例2-讀寫十六進制:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]) { FILE *fp = NULL; int readbuf; int readEnd; int writebuf=100; int len; fp = fopen("./1.txt","rb+"); printf("read 1.txt: fp==NULL=%d size=%d\n",fp == NULL,sizeof(readbuf)); if(fp!=NULL) //打開成功,讀數據 { len=fread(&readbuf,sizeof(int),1,fp); //讀寫開頭的第一個int型數據 printf("read len=%d data=%d\n",len,readbuf); fseek(fp,-sizeof(int),SEEK_END); //將fp指向文件末尾的最后一個int型數據處 fread(&readEnd,sizeof(int),1,fp); printf("read file end =%d\n",readEnd); fclose(fp); } else //打開失敗,則創建文件 { fp = fopen("./1.txt","wb+"); printf("write 1.txt: fp==NULL=%d size=%d\n",fp == NULL,sizeof(readbuf)); if(fp!=NULL) { len=fwrite(&writebuf,sizeof(int),1,fp); //寫入一個int型數據 printf("write len=%d \n",len); fclose(fp); } } return 0; }
運行第一次:
運行第二次
示例3-讀寫某個文件的十六進制以及對應字符串
代碼如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]) { FILE *fp = NULL; unsigned char buf[100]; int seek; int len=10; int readl=0; char s[20]="./"; strcat(s,argv[1]); printf("file:%s\n",s); //打印要訪問當前目錄下的哪個文件 seek=strtoul(argv[2],0,0); len=strtoul(argv[3],0,0); fp = fopen(s,"rb+"); if(fp!=NULL) //打開成功,讀數據 { printf("input seek=%d len=%d \n",seek,len); //打印,從文件哪個字節位置處,讀多少個字節 fseek(fp,seek,0); readl=fread(&buf,1,len,fp); printf("read len=%d\n",readl); //打印實際讀出的字節長度 for(int i=0;i<=(readl/10);i++) { for(int j=0;j<10;j++) { if((i*10+j)>=readl) printf(" "); else printf("%d ",buf[i*10+j]); //打印讀出的16進制數據 } printf(" ||"); for(int j=0;j<10;j++) { if((i*10+j)>=readl) break; printf("%c",buf[i*10+j]); //打印16進制數據對應的字符串 } printf("\n"); } fclose(fp); } return 0; }
以訪問test.txt文件為例,它的內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
運行示例:
char *fgets(char *buf, int bufsize, FILE *stream);
讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦'\0'),如果文件中的該行,不足bufsize-1個字符,則讀完該行就結束。
如若該行(包括最后一個換行符)的字符數超過bufsize-1,則fgets只返回一個不完整的行
返回值
- 如果為NULL,表示讀到文件結尾或者出錯,否則返回讀成功的緩存區地址
bufsize
- 如果n=1,會返回空串
示例-打印文件全部數據:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]) { FILE *fp = NULL; char readbuf[5]; fp = fopen("./1.txt","r+"); printf("(DEBUG)read 1.txt: fp==NULL=%d\n",fp == NULL); if(fp!=NULL) //打開成功,讀數據 { while(fgets(readbuf, sizeof(readbuf),fp)) { printf("%s",readbuf); } fclose(fp); } return 0; }
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
頭文件#include <stdio.h>
- 若popen ()的type是”r”,則文件指針是連接到子進程執行command命令的標准輸出。
- 若popen ()的type是”w”,則文件指針連接到子進程執行command命令的標准輸入。
示例
#include <stdio.h> #include <stdlib.h> #include <string.h> int run_command(const char *cmd, const char *type) { FILE *fp; int res; char buf[1024];
if ((fp = popen(cmd, type)) ==NULL) { printf("popen err \n"); return -1; } if(type[0]=='r') //如果是讀數據 { while(fgets(buf, sizeof(buf),fp)) { printf("%s",buf); } } pclose(fp); return 0; } int main(int argc,char* argv[]) { run_command("vi 1.txt","r"); return 0; }
效果:
int access(const char *pathname, int mode);
頭文件:#include <unistd.h>
用來檢測訪問的文件屬性,是否可以讀寫,存在,執行
mode
模式有以下幾種:
#define F_OK 0 /* Check for file existence */
#define X_OK 1 /* Check for execute permission. */
#define W_OK 2 /* Check for write permission */
#define R_OK 4 /* Check for read permission */
示例-檢測文件是否存在
#include <stdio.h> #include <unistd.h> int file_exists(char *filename); int main(void) { printf("Does NOTEXIST.FIL exist: %s\n", file_exists("./1.txt") ? "YES" : "NO"); return 0; } int file_exists(char *filename) { return (access(filename, 0) == 0); }
如果在嵌入式linux中,則有可能在寫數據后強制關電,此時數據還在緩沖區,並沒寫到flash中,所以需要在fclose()前面加上:
fflush(fp); //會把緩沖區中的文件寫到文件系統中 fsync(fileno(fp)); //同步數據到flash fclose(fp);