C語言中文件流操作基本函數總結
阿新 • • 發佈:2018-09-20
打印 highlight -s 技術分享 null strong 進制 數組 for
函數所在頭文件:stdio.h
說明:前半部分主要為對各個文件流操作函數的例舉,後半部分著重於
上機運行分析。文中部分引用自王桂林老師的C/C++課件。
1.FIELE *fopen(const char*filename,const char *mode)
以mode的方式,打開一個以filename(指針類型)命名的文件,
返回一個指向該文件緩沖區的指針,該指針是後續操作的句柄。
2.int fclose(FILE *stream)
fclose()用來關閉先前用fopen()打開的文件。並讓文件緩沖
區的數據寫入文件中,並釋放系統提供的文件資源。成功範返回
0;失敗返回-1(EOF) 。
示例1:
#include <stdio.h> int main() { FILE * fp = fopen("data.txt", "w"); //以"w"的方式打開一個名為"data.txt"的文件,文件不存在則創建 //判斷文件是否都打開成功 if(fp == NULL) { printf("open error!\n"); return -1; } fputs("china is great!!", fp); //向文件中寫入"chia is great!!" fclose(fp); //關閉文件 return 0; } //該程序運行完畢,在該工程目錄下生成了一個"data.txt"的文本文件,其內容為上述字符串
3.int fputc(int ch,FILE *stream)
將ch字符寫入文件,成功返回寫入字符,失敗返回-1。
int fputs(char *str,FILE *fp)
將str指向的字符串寫入fp指向的文件中,正常返回0;失敗返回1.
示例2:
#include <stdio.h> int main() { FILE* fp = fopen("data.txt","w"); if(fp == NULL) { printf("open error\n"); return -1; } char ch; for(ch = ‘a‘; ch<=‘z‘; ch++) printf("%3c",fputc(ch,fp));
//將字符寫入文本的同時,將其打印出來 fclose(fp); return 0; }
程序運行結果:
同時,也在工程目錄下生成了一個叫"data.txt"的文件,打開文件
可以發現其內容為a~z。
4.int fgetc(FILE *stream)
從文件流中讀取一個字符並返回。成功返回讀取的字符;讀到文件
末尾或失敗返回-1。
char *fgets(char *str,int length,FILE *fp)
從fp指向的文件中,至多讀length-1個字符,送入數組str
中,如果在讀入length-1個字符結束前遇到\n或EOF,讀入即
結束,字符串讀入後在最後加一個‘\0‘字符。
正常返回str指針,出錯或遇到文件結尾,返回NULL指針。
示例3:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","r");
//data.txt內容為a~z
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char ch;
while((ch = fgetc(fp)) != EOF)
printf("%3c",ch);
fclose(fp);
return 0;
}
程序運行結果:
5.int feof(FILE *stream)
判斷文件是否讀到末尾,未讀到末尾返回0,非零讀到末尾。一般不
用,文件讀到結尾,再去讀一次,容易導致多讀一次。不建議使用!
6.int fread(void* buffer,int num,int count,FILE *fp)
int fwrite(void*buffer,int num,int count,FILE *fp)
將buffer指向的數據寫入fp指向的文件中,或是把fp指向的文件中的數
據讀到buffer中,num為每個要讀寫的字段數的字節數,count為要讀寫
的字段數。成功返回讀/寫的字段數(count);出錯或文件結束返回0。
這兩個函數不同於其他函數,當我們試圖用fread/fwrite去讀寫文本文
件的時候,發現文本中的格式己經沒有任何意義,只是一個普通的字符。
它所進行的操作為二進制操作,通俗來說就是對一些文本標識符如‘\0‘,
‘\n‘等已經不敏感了,這些文本標識符都被當做成一個二進制來讀寫。
7.void rewind(FILE *STREAM)
將文件指針重新指向一個流的開頭。
8.int ftell(FILE *stream)
得到流文件的當前讀寫位置,其返回值是當前讀寫位置偏離文件頭
部的字節數。失敗返回-1。
9.int fseek(FILE *stream,long offset,int where)
偏移文件指針,成功返回0,失敗返回-1。where是偏移的起始位置。
//#define SEEK_CUR 1 當前位置
//#define SEEK_END 2 文件結尾
//#define SEEK_SET 0 文件開頭
fseek(fp,100L,0);把fp指針移動到離文件開頭100字節處;
fseek(fp,100L,1);把fp指針移動到離文件當前位置100字節處;
fseek(fp,-100,2);把fp指針退回到離文件結尾100字節處。
示例4:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char ch;
for( ch = ‘a‘; ch<=‘z‘; ch++)
{
fputc(ch,fp);
}
rewind(fp);
//此處一定不能少,否則文件指針將指向文件末尾,而打印不出任何東西
while((ch = fgetc(fp))&& !feof(fp))
{
printf("%3c",ch);
}
fclose(fp);
return 0;
}
程序運行結果:
示例5:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
fputs("abcd\nefg",fp);
rewind(fp);
char ch;
while((ch = fgetc(fp)) != EOF)
printf("%c",ch);
fclose(fp);
return 0;
}
程序運行結果:
示例6:
下面是一個很有意思的程序,請判斷下fgets()共執行了多少次;
先別看答案,相信這個理解了,這部分問題就不會太大,下面直接
上程序:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","r");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char buf[10] = {0};
int count = 0;
while(fgets(buf,10,fp) != NULL) //註意,即使沒遇到結束符,每次也只能讀9個字符
{
printf("%s",buf);
count++;
}
fclose(fp);
putchar(10);
printf("+++++++++%d++++++++++",count);
return 0;
}
其中data.txt是這樣的:
程序運行結果:
從運行結果來看,似乎是執行了5次,但仔細看看,真的是5次嗎?
實際上,每讀取一次,判斷返回的指針是否為空,若不為空,則count加
1,若為空,則不執行循環體。因此,實際上是讀取了6次,只是最後一
次讀取後發現到了文件末尾,因此返回來一個空指針,判斷為空指針
沒執行count++操作。值得註意的是fgets()每次讀取的字符數。
示例7:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
fputs("china is great!!",fp);
int i = ftell(fp);
printf("%d\n",i);
//打印當前指針位置離文件頭的字節數
rewind(fp);
//讓文件指針指向文件頭
i = ftell(fp);
printf("%d\n",i);
char buf[20] = {0};
fgets(buf,20,fp);
printf("%s\n",buf);
fclose(fp);
return 0;
}
程序運行結果:
示例8:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
fputs("china is great!!",fp);
fseek(fp,2,0);
//將文件指針偏移到離文件頭兩個字節的位置
char buf[20];
fgets(buf,20,fp);
printf("%s\n",buf);
fclose(fp);
return 0;
}
程序運行結果:
示例9:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fpw = fopen("bin.txt","wb+");
if(fpw == NULL)
return -1;
char *p = "china \n is \0 great";
fwrite(p,1,strlen(p)+7,fpw);
//將指針的內容寫入到文件中,由於strlen()所求長度
//遇到0截止,因此需將0後面的元素補上。
rewind(fpw);
char buf[1024];
int n = fread(buf,1,1024,fpw);
//每次讀取一個字節,讀取1024次,返回讀取的字段數(此處為字節數)
//遇到文件末尾或讀取錯誤返回0
printf("%d\n",n);
int i = 0;
for(i = 0;i<n;i++)
printf("%c",buf[i]);
fclose(fpw);
return 0;
}
程序運行結果:
C語言中文件流操作基本函數總結