在頭文件<stdio.h>中提供處理問件的庫函數。
文件的兩種類型:文本文件和二進制文件
文本文件:將數據寫入文本文件時,數據寫入爲字符,這些字符組成爲數據行,在每一行的末尾用換行結束。如果寫入的是二進制數據,例如int或者double類型,則先將其轉化成字符類型,在寫入文件
二進制文件:將數據寫入二進制文件時,總是寫入一系列字節,與他在內存中的表現形式相同,例如double類型就是寫入8個字節。
總結:字符數據本身在內存中就經過了編碼,所以無論是二進制還是文本形式都是一樣的,而對於非字符數據來說,例如inti=10;如果用二進制來進行存儲的話爲1010,但是如果需要用文本形式來進行存儲的話就必須進行格式化編碼(對1和0分別編碼,即形式爲‘1’和‘0’分別對應的碼值)。
打開文件
FILE *fopne( char *name, char *mode)
其中mode可以爲:“w”,“a”,“r”
當mode爲“w”或者“a“時,如果name爲一個包含目錄的路徑,而且其中有一部分目錄不存在,則返回NULL,否則如果只是一個文件名而且在當前目錄下沒有這個文件,則創建這個文件不返回NULL。
當mode爲”r“時,如果文件不存在,則返回NULL。
文件重命名
int rename(const char *oldname, const char *newname)
如果文件刪除成功,則返回0;如果文件刪除失敗,則返回非零值。
刪除文件
remove(char *naem)
刪除時,文件不應該是打開的。
清除緩衝區(將緩衝區中的數據寫入文件中)
fflush(pfile)
如果寫入成功的,則返回0;如果寫入失敗,返回EOF。
在文件中移動
獲得文件中的當前位置
int ftell(FILE *pfile)
返回long類型的變量,表示距離文件開頭的偏移字節數
int fgetpos(FILE *pfile, fpos_t *position)
成功,則在position中存儲當前位置和文件的狀態信息,並返回0,否則返回非零整數。
在文件中設定位置
int fseek(FILE *pfile, long offset, int origin)
對於文本文件,origin必須是SEEK_SET,成功,返回0;失敗,返回非零值。
int fsetpos(FILE *pfile, fpos_t *position )
成功,返回0;失敗,返回非零值。
創建臨時文件
FILE pfile;
pfile = tmpfile();
判斷是否到達文件尾
feof()
如果文件結束,則返回非0值,否則返回0.
文本文件操作
向文本文件中寫入一個字符
int fputc(int c, FILE *pflie)
寫入成功,返回寫入的字符;寫入失敗,返回EOF。
注意:fputc ()函數與putc()函數等價,唯一的區別就是putc()函數是一個宏,而fputc()實現爲一個函數。
從文本文件中讀取一個字符
int fgetc( FILE* pfile)
讀取成功,將返回讀取的字符;讀取失敗,則返回EOF。
注意:fgetc ()函數與getc()函數等價,唯一的區別就是getc()函數是一個宏,而fgetc()實現爲一個函數。
向文本文件中寫入字符串
int fputs( char *pstr, FILE *pfile)
將字符串寫入文件直到碰到‘\0’,但是‘\0’不會寫入文件。通常是寫入一行字符串最後加一個換行符。
寫入成功,返回0或者整數,否則返回EOF。
從文本文件中讀取字符串
char *fgets( char *pstr, int nchars, FILE *pfile)
從文本文件中讀取字符串,直到碰到‘\n’或者已經讀入nchars-1個字符爲止。
讀取成功,返回pstr指針;否則返回NULL。
格式化文件輸入輸出
輸入到文件:fprintf(FILE* pflie, ”格式字符串“, 變量);
從文件輸出:fscanf(FILE* pflie, ”格式字符串“, 變量);
注意:數據存放在文件中,只是存放字節,這些字節的意義取決與你怎麼解釋它們。
代碼框架如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
FILE *file1 = NULL;
FILE *file2 = NULL;
char str[] = "sdgfsdfgdsgfsdgd!";
int len = strlen(str);
int ch = 0;
int const CHAR_MAX = 80;
char *proverbs[] ={
"sdgfsdgdfsgfdsgds\n",
"dfgfsdgdfshhhhhhhfdgj",
"sgdfsfdshsdfh"
"dsgdfshdshds\n"
};
if(!(file1 = fopen("test1.txt", "w")))
{
printf("打開文件失敗");
exit(1);//使用此函數必須引入stdlib.h頭文件
}
/*
向文本文件中寫入一個字符
*/
size_t i ;
for ( i = 0; i < len; i++)
{
if( fputc(str[i], file1) != EOF )
{
printf("寫入%c成功\n", str[i] );
}
}
/*
向文本文件中寫入字符串
*/
int count = sizeof(proverbs)/sizeof(proverbs[1]);
size_t j ;
for(j = 0; j < count; j++)
{
if ( fputs(proverbs[j], file1) != EOF) {
printf("成功將字符串%s寫入文件\n", proverbs[j]);
}else{
printf("寫入字符串%s失敗\n", proverbs[j]);
}
}
fflush(file1);
fclose(file1);
if (!(file2 = fopen("test1.txt", "r"))) {
printf("打開文件失敗" );
exit(1);
}
/*
從文本文件中讀取一個字符
while ( (ch = fgetc(file2)) != EOF) {
printf("從文件中讀取%c成功!\n",ch );
}
*/
/*
從文本文件中讀取字符串
*/
char temp[CHAR_MAX];//char temp = NULL;不可以
while( fgets(temp, CHAR_MAX, file2))
{
printf("從文本文件中讀取字符串:%s\n",temp );
}
fclose(file2);
return 0;
}
注意:在將數據寫入文件之後並不可以馬上讀取,同樣,在讀取文件數據之後也不可以馬上寫文件。因爲將數據寫入到文件之後,並不是將數據寫到外部設備上,而是將其放入緩衝區中,直到緩衝區滿了或者發生其他情況,纔將數據寫入文件中。同理,當讀取文件數據的時候,會將數據讀取到緩衝區中,直到緩衝區的數據空了,纔會繼續從文件中讀取數據。因此,在讀模式和寫模式之間進行轉換的時候,需要使用fflush()函數刷新緩衝區。
二進制文件操作
寫入二進制文件
size_t fwrite( const void* buffer, size_t size, size_t count, FILE* pfile)
寫入成功,則返回與count一樣的數,否則,返回其真實寫入的數據的個數。
讀區二進制文件
size_t fread ( void *buffer, size_t size, size_t count, FILE *pfile)
讀取成功,則返回與count一樣的數,否則,返回其真實讀取的數據的個數。