C 標準提供一些函數(shù)用來檢查輸入輸出函數(shù)調(diào)用中的錯誤。
13.6.1 ferror 函數(shù)
在調(diào)用各種輸入輸出函數(shù)(如 putc, getc , fread, fwrite 等)時,日過出現(xiàn)錯誤,除了函數(shù)返回值有所反映外,還可以用 ferror 函數(shù)檢查。它的一般調(diào)用形式為 ferror(fp); 如果 ferror 函數(shù)返回值為0(假),表示未出錯;如果返回一個非零值,表示出錯。應(yīng)該注意,對同一個文件每一次調(diào)用輸入輸出函數(shù),均產(chǎn)生一個新的 ferror 函數(shù)值,因此,應(yīng)當在調(diào)用一個輸入輸出函數(shù)后立即檢查 ferror 函數(shù)的值,否則信息會丟失。
在執(zhí)行 fopen 函數(shù)時,ferror 函數(shù)的初始值自動置為0。
13.6.2 clearerr (清除錯誤) 函數(shù)
clearerr 函數(shù)的作用是使文件錯誤標志和文件結(jié)束標志置為0。假設(shè)在調(diào)用一個輸入輸出函數(shù)時出現(xiàn)錯誤, ferror 函數(shù)值為一個非零值。在調(diào)用 clearerr
(fp)后,ferror(fp)的值變成0。
只要出現(xiàn)錯誤標志,就一直保留,直到對同一文件調(diào)用 clearerr 函數(shù)或(重新)rewind 函數(shù),或任何其它一個輸入輸出函數(shù)。
13.7 文件輸入輸出小結(jié)
在本節(jié)中將以上介紹過的輸入輸出函數(shù)作一概括性的小結(jié),以一目了然,便于查閱。下表列出常用的緩沖文件系統(tǒng)函數(shù)。
分類 函數(shù)名 功 能
打開文件 fopen() 打開文件
關(guān)閉文件 fclose() 關(guān)閉文件
文 fseek() 改變文件位置指針的位置
件 rewind() 使文件位置指針重新置于文件開頭
定位 ftell() 返回文件位置指針的當前值
文 fgetc(),getc() 從指定文件取得一個字符
件 fputc(),putc() 把字符輸出到指定文件
讀 fgets() 從指定文件讀取字符串
寫 fputs() 把字符串輸出到指定文件
getw() 從指定文件讀取一個字(int)型
putw() 把一個字(int)型輸出到指定文件
fread() 從指定文件中讀取數(shù)據(jù)項
fwrite() 把數(shù)據(jù)項寫到指定文件
fscanf() 從指定文件按格式輸入數(shù)據(jù)
fprintf() 按指定格式將數(shù)據(jù)寫到指定文件中
文 feof() 若到文件末尾,函數(shù)值為“真”(非0)
件 ferror() 若對文件操作出錯,函數(shù)值為“真”(非0)
狀態(tài) clearerr() 使 ferror 和 feof 函數(shù)值置零
文件這一章的內(nèi)容是很重要的,許多可供實際使用的 C 程序都包含文件處理
.
本章只介紹一些最基本的概念,由于篇幅所限,不可能舉復(fù)雜的例子。
如何進行文件操作(程序如下)
#include "stdio.h"
main() /*先新建一個文件夾(file.txt),運行該程序后,就有輸入到文件中.*/
{
FILE *fp;
int x,y,x1,y1,z;
printf("please input two integer numbers:");
scanf("%d %d",&x,&y);
if((fp=fopen("file.txt","w"))==NULL) /*打開文件file.txt,準備往文件中寫入數(shù)據(jù)*/
{
printf("cann't open file");
exit(0);
}
fprintf(fp,"%d %d",x,y); /*將x,y的值寫入文件*/
fclose(fp); /*關(guān)閉文件*/
if((fp=fopen("file.txt","r"))==NULL) /*打開文件file.txt,準備從文件中讀出數(shù)據(jù)*/
{
printf("cann't open file");
exit(0);
}
fscanf(fp,"%d %d",&x1,&y1); /*將剛才寫入的兩個整數(shù)分別讀到變量x1,y1中*/
fclose(fp); /*關(guān)閉文件*/
z=x1+y1; /*計算兩個數(shù)的和*/
printf("z=%d",z); /*顯示在屏幕上*/
}
file2.c 程序
#include<stdlib.h>
#include<stdio.h>
void main()
{
FILE*in,*out;
char ch,infile[10],outfile[10];
printf("Enter the infile name:\n");
scanf("%s",infile);
printf("Enter the infile name:\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{
printf("can not open infile\n");
exit(0);
}
if((out=fopen(outfile,"w"))==NULL)
{
printf("can not open outfile\n");
exit(0);
}
while(! feof(in)) fputc(fgetc(in),out);
fclose(in);
fclose(out);
}
file1(文本文檔里的內(nèi)容)
11 12