C文件概述
1、所谓“文件”是指一组相关数据的有序集合。
2、这个数据集合有一个名称,叫做文件名
3、文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来
4、操作系统是以文件为单位对数据进行管理的
文件分类
1、从用户观点:
a) 特俗文件(标准输入输出文件或标准设备文件)
b) 普通文件(磁盘文件)
2、从操作系统的角度看,每个与主机相连的输入、输出设备看作是一个文件
3、按数据的组织形式:
a) ASCII文件(文本文件):每一个字节放一个ASCII代码
b) 二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放
C语言对文件的处理方法
缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。
非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级输入输出系统。
文件的打开与关闭
1、文件的打开(fopen函数)
2、文件的关闭(fclose函数)
函数功能:使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作
返回值:关闭成功返回值为0;否则返回EOF(-1)
使用文件的方式共有12种,下面给出了它们的符号和意义。
文件使用方式 |
意义 |
“r” |
只读打开一个文本文件,只允许读数据 |
“w” |
只写打开或建立一个文本文件,只允许写数据 |
“a” |
追加打开一个文本文件,并在文件末尾写数据 |
“rb” |
只读打开一个二进制文件,只允许读数据 |
“wb” |
只写打开或建立一个二进制文件,只允许写数据 |
“ab” |
追加打开一个二进制文件,并在文件末尾写数据 |
“r+” |
读写打开一个文本文件,允许读和写 |
“w+” |
读写打开或建立一个文本文件,允许读写 |
“at+” |
读写打开一个文本文件,允许读,或在文件末追加数据 |
“rb+” |
读写打开一个二进制文件,允许读和写 |
“wb+” |
读写打开或建立一个二进制文件,允许读和写 |
“ab+” |
读写打开一个二进制文件,允许读,或在文件末追加数据 |
文件的读写
字符读写函数: fgetc 和 fputc
1、在文件内部有一个位置指针,用来指向文件的当前读写字节
2、在文件打开时,该指针总是指向文件的第一个字节,只用fgetc函数后,该位置指针将向后移动一个字节,因此可连续多次使用fgetc函数,读取多个字符
3、文件指针和未见内部的位置指针不是一回事
4、文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的
5、文件内部的位置指针用以知识文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需要在程序中定义说明,而是由系统自动设置的
fputc(ch, fp);
函数功能: 将字符(ch的值)输出到fp所指向的文件中去
/*
2011年09月21日21 :54:59
功能:
字符读写函数: fgetc 和 fputc
fputc(ch, fp);
函数功能: 将字符(ch的值)输出到fp所指向的文件中去
*/
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE * fp;
char ch, filename[20];
printf("Please input the filename you want to write:");
scanf("%s", filename);
if(!(fp = fopen(filename, "wt++"))) // 文件的打开(fopen函数); “wt+” 读写打开或建立一个文本文件,允许读写
{
printf("Cannot open the file!\n");
exit(0);//终止程序
}
printf("Please input the sentences you want to write:");
ch = getchar();
ch = getchar();
while( ch != EOF) //EOF为文件结束
{
fputc(ch, fp); //fputc(ch, fp); 函数功能: 将字符(ch的值)输出到fp所指向的文件中去
ch = getchar();
}
fclose(fp);
}
/*
2011年09月21日22 :23:29
*/
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE * fp;
char ch, filename[20];
printf("Please input the filename you want to write:");
scanf("%s", filename);
if(!(fp = fopen(filename, "r"))) // 文件的打开(fopen函数); “wt+” 读写打开或建立一个文本文件,允许读写
{
printf("Cannot open the file!\n");
exit(0);//终止程序
}
while( ch != EOF) //EOF为文件结束 EOF 也就等价于 -1 表示读到文件末尾了 或者说 是 文件的结束符
{
ch = fgetc(fp);
putchar(ch); //putchar();用于把ch显示在屏幕上
}
fclose(fp);
}
/*
2011年09月25日13 :03:29
功能:
完成文本文件的复制
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *in, *out;
char infile[10];
char outfile[10];
char c;
printf("enter the infile name:\n");
scanf("%s", infile);
printf("enter the outfile name:\n");
scanf("%s", outfile);
if( (in=fopen(infile, "r")) == NULL ) // “r” 只读打开一个文本文件,只允许读数据
exit(0);
if( (out=fopen(outfile, "w")) == NULL ) // “w” 只写打开或建立一个文本文件,只允许写数据
exit(0);
c=fgetc(in); //fgetc(), getc() 从指定文件取得一个字符
while(!feof(in)) //文件状态 feof() 若到文件末尾,函数值为真
{
fputc(c, out); //fputc(), putc() 把字符输出到指定文件
c=fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}
/*
2011年09月25日13 :10:03
功能:
完成二进制文件的复制
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *in, *out;
char infile[10];
char outfile[10];
char c;
printf("enter the infile name:\n");
scanf("%s", infile);
printf("enter the outfile name:\n");
scanf("%s", outfile);
if( (in=fopen(infile, "rb")) == NULL ) // “rb” 只读打开一个二进制文件,只允许读数据
exit(0);
if( (out=fopen(outfile, "wb")) == NULL ) // “wb” 只写打开或建立一个二进制文件,只允许写数据
exit(0);
c=fgetc(in); //fgetc(), getc() 从指定文件取得一个字符
while(!feof(in)) //文件状态 feof() 若到文件末尾,函数值为真
{
fputc(c, out); //fputc(), putc() 把字符输出到指定文件
c=fgetc(in);
}
fclose(in);
fclose(out);
return 0;
}
字符串读写函数:fgets 和 fputs
1、只能处理文本文件,不能处理二进制文件
2、返回值:
1. 输入成功:返回值为0;
2. 输入失败:返回EOF;
例一:字符串写入:
/*
2011年09月22日21 :52:25
字符串读写函数:fgets 和 fputs
返回值:
1. 输入成功:返回值为0;
2. 输入失败:返回EOF;
*/
#include <stdio.h>
#include <stdlib.h>
#define LEN 11;
void main()
{
FILE * fp;
char buffer[30], ch;
if( !(fp = fopen("qintangtao.txt", "at+")) ) // “at+” 读写打开一个文本文件,允许读,或在文件末追加数据 文件指针指向了文件的结尾处
{
printf("\nCannot open file strike any key exit!");
exit(1);
}
printf("Please input a string:\n");
// scanf("%s", buffer); // 用scanf();接收时 当遇到 空格、换行 就认为结束了
fgets(buffer, 30, stdin); //为什么不用scanf()? stdin又是什么?
fputs(buffer, fp);
rewind(fp); //重新定义文件内部指针指向文件的开头处
ch = fgetc(fp);
while( ch != EOF )
{
putchar(ch); //输出到屏幕上
ch = fgetc(fp);
}
printf("\n");
fclose(fp);
system("pause");
}
例二:字符串读出
/*
2011年09月22日19 :40:44
总结:
字符串读写函数:fgets 和 fputs
*/
#include <stdio.h>
#include <stdlib.h>
#define LEN 11;
void main()
{
FILE * fp;
char buffer[11];
if( !(fp = fopen("qintangtao.txt", "rt")) ) //是否能够打开文件
{
printf("\nCannot open file strike any key exit!");
exit(1);
}
fgets(buffer, 11, fp); //从fp中读出11个字节存放在buffer中
printf("%s\n", buffer);
fclose(fp);
system("pause");
}
/*
2011年09月25日14 :05:49
功能:
输入学生的信息存入student.txt文件中
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
char student[50];
int i;
//scanf("%s", student); // 当输入 1001 tom 92.3 时 只能把1001存入文件中 因为在遇到空格时 scanf就把它当成了结束的标记 所以要用下面的 gets(student); 来进行输入
if( (fp=fopen("student.txt", "w"))==NULL )
exit(0);
for(i=0; i<3; i++)
{
gets(student);
fputs(student, fp); //整行的存入文件中
fputs("\n", fp); //换行
}
return 0;
}
/*
2011年09月25日14 :17:13
功能:
从student.txt文件中读取数据并显示在屏幕上
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
char string[80];
if( (fp=fopen("student.txt", "r"))==NULL )
exit(0);
while( fgets(string, 80, fp)!=NULL )
{
//printf("%s", string); //也可以用下面的方法将内容显示在屏幕上
fputs(string, stdout); //stdout函数是将内容显示到屏幕上
}
return 0;
}
数据块(二进制文件的)读写函数:fread 和 fwrite
函数调用:
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
参数说明:
buffer: 是一个指针
对fread来说,它是读入数据的存放地址
对fwrite来说,是要输出数据的地址(均指起始地址)
size: 要读写的字节数
count:要进行读写多少个size字节的数据项
fp:文件指针
例一:数据块写入:
/*
2011年09月22日23 :01:25
总结:
函数调用:
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
参数说明:
buffer: 是一个指针
对fread来说,它是读入数据的存放地址
对fwrite来说,是要输出数据的地址(均指起始地址)
size: 要读写的字节数
Count:要进行读写多少个size字节的数据项
fp:文件的指针
*/
#include <stdio.h>
#define SIZE 4
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
void save()
{
FILE *fp;
int i;
if( !(fp = fopen("student-list", "wb")) ) // “wb” 只写打开或建立一个二进制文件,只允许写数据
{
printf("Cannot open the file!\n");
return;
}
for( i=0; i<SIZE; i++ )
{
if( fwrite(&stu[i], sizeof(struct student), 1, fp) !=1 ) //fwrite(buffer, size, count, fp);
{
printf("File write error!\n");
fclose(fp);
}
}
}
void main()
{
int i;
printf("Please input the student's name, num, age and address: \n");
for ( i=0; i<SIZE; i++ )
{
scanf("%s %d %d %s", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr );
}
save();
}
例二:数据块读出:
/*
2011年09月22日23 :03:30
总结:
函数调用:
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
参数说明:
buffer: 是一个指针
对fread来说,它是读入数据的存放地址
对fwrite来说,是要输出数据的地址(均指起始地址)
size: 要读写的字节数
Count:要进行读写多少个size字节的数据项
fp:文件的指针
*/
#include <stdio.h>
#define SIZE 4
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
//函数声明
void load();
void main()
{
int i;
load();
printf(" name num age adress\n\n");
for ( i=0; i<SIZE; i++ )
{
printf("%10s %5d %5d %10s \n", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr );
}
}
void load()
{
FILE *fp;
int i;
if( !(fp = fopen("student-list", "r")) )
{
printf("Cannot open the file!\n");
return;
}
for( i=0; i<SIZE; i++ )
{
fread(&stu[i], sizeof(struct student), 1, fp); //fread(buffer, size, count, fp);
}
fclose(fp);
};
/*
2011年09月25日20 :10:22
功能:
据块(二进制文件的)读写函数:fread 和 fwrite
函数调用:
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
参数说明:
buffer: 是一个指针
对fread来说,它是读入数据的存放地址
对fwrite来说,是要输出数据的地址(均指起始地址)
size: 要读写的字节数
count:要进行读写多少个size字节的数据项
fp:文件指针
*/
#include <stdio.h>
#include <stdlib.h>
struct student
{
long num;
char name[10];
int age;
} s[4];
int main(void)
{
FILE * fp;
int i;
if( (fp=fopen("student.dat", "w+")) == NULL ) // “w+”读写打开或建立一个文本文件,允许读写
exit(0);
for(i=0; i<4; i++)
{
printf("第%d个学生:\n", i+1);
printf("学号:");
scanf("%ld", &s[i].num);
printf("姓名:");
scanf("%s", s[i].name);
printf("年龄:");
scanf("%d", &s[i].age);
//fwrite(&s, sizeof(struct student), 1, fp); // fwrite(buffer, size, count, fp);
}
fwrite(s, sizeof(struct student), 4, fp);
rewind(fp); //文件内部指针指向第一个字节
// for(j=0; j<4; j++)
// {
// fread(&s, sizeof(struct student), 1, fp); // fread(buffer, size, count, fp);
// printf("%ld %s %d\n", s.num, s.name, s.age);
// }
fread(s, sizeof(struct student), 4, fp);
for(i=0; i<4; i++)
{
printf("%ld %s %d\n", s[i].num, s[i].name, s[i].age);
}
fclose(fp);
return 0;
}
格式化读写函数: fscanf 和fprinf
函数调用:
fprintf(文件指针, 格式字符串, 输出表列);
fscanf(文件指针, 格式字符串, 输入表列);
函数功能:
从磁盘文件中按格式读入或输出字符。
例如:
fprintf(fp, "%d %6.2f", i, t);
fscanf(fp, "%d %f", &i, &t);
/*
2011年09月25日14 :56:07
函数调用:
fprintf(文件指针, 格式字符串, 输出表列);
fscanf(文件指针, 格式字符串, 输入表列);
函数功能:
从磁盘文件中按格式读入或输出字符。
*/
#include <stdio.h>
FILE *stream;
void main( void )
{
long l;
float fp;
char s[81];
char c;
stream = fopen( "fscanf.out", "w+" ); // “w+” 读写打开或建立一个文本文件,允许读写
if( stream == NULL )
printf( "The file fscanf.out was not opened\n" );
else
{
fprintf( stream, "%s %ld %f%c", "a-string", //为什么%f%c之间没有空格 fscanf( stream, "%c", &c ); 才能把'x'读取出来?
65000, 3.14159, 'x' );
/* Set pointer to beginning of file: */
fseek( stream, 0L, SEEK_SET );// 改变文件的位置指针 fseek(文件类型指针, 位移量, 起始点);
/*
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
*/
/* Read data back from file: */
fscanf( stream, "%s", s ); //按照什么顺序输入就按照什么顺序输出
fscanf( stream, "%ld", &l );
fscanf( stream, "%f", &fp );
fscanf( stream, "%c", &c );
/* Output data read: */
printf( "%s\n", s );
printf( "%ld\n", l );
printf( "%f\n", fp );
printf( "%c\n", c );
fclose( stream );
}
}
/*
2011年09月25日14 :40:07
功能:
函数调用:
fprintf(文件指针, 格式字符串, 输出表列);
函数功能:
从磁盘文件中按格式输出字符。
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 10;
double fp = 1.5;
char s[]="this is a string!";
char c = '\n';
FILE * stream;
stream = fopen("fprintf.out", "w");
fprintf(stream, "%s%c", s, c);
fprintf(stream, "%d\n", i);
fprintf(stream, "%f\n", fp);
fclose(stream);
system("type fprintf.out"); //此函数是将fprintf.out文件中的内容显示在屏幕上
return 0;
}
/*
2011年09月25日14 :40:07
功能:
格式化输入学生信息-fprintf.c
函数调用:
fprintf(文件指针, 格式字符串, 输出表列);
函数功能:
从磁盘文件中按格式输出字符。
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
long num;
char name[10];
int age;
int i;
if( (fp=fopen("stuendt.txt", "w")) == NULL )
exit(0);
for(i=0; i<5; i++)
{
printf("第%d个学生:\n", i+1);
printf("学号:");
scanf("%ld", &num);
printf("姓名:");
scanf("%s", name);
printf("年龄:");
scanf("%d", &age);
fprintf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", num, name, age);
}
fclose(fp);
return 0;
}
/*
2011年09月25日15 :37:36
功能:
格式化输出学生信息-fscanf.c
函数调用:
fscanf(文件指针, 格式字符串, 输入表列);
函数功能:
从磁盘文件中按格式读字符。
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
long num;
char name[10];
int age;
if( (fp=fopen("stuendt.txt", "r")) == NULL )
exit(0);
while( !feof(fp))
{
// fprintf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", num, name, age);
fscanf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", &num, name, &age); //一定要按照 fprintf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", num, name, age); 中存入的格式来读取
printf("%ld %s %d\n", num, name, age);
}
fclose(fp);
return 0;
}
顺序读写和随机读写
顺序读写:
位置指针按字节位置顺序移动
随机读写:fseek函数
读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上多需要的字符(字节)
函数功能:
改变文件的位置指针
函数的调用形式:
fseek(文件类型指针, 位移量, 起始点);
参数:
起始点:
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例如:
fseek(fp, 100L, 0);
将位置指针移到离文件头100个字节处
fseek(fp,50L, 1);
将位置指针移到离当前位置50个字节处
fseek(fp,10L, 2);
将位置指针从文件末尾处向后退10个字节
例子:
/*
2011年09月22日23 :38:53
总结:
顺序读写和随机读写
顺序读写:
位置指针按字节位置顺序移动
随机读写:fseek函数
读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上多需要的字符(字节)
函数功能:
改变文件的位置指针
函数的调用形式:
fseek(文件类型指针, 位移量, 起始点);
参数:
起始点:
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例如:
fseek(fp, 100L, 0);
将位置指针移到离文件头100个字节处
fseek(fp,50L, 1);
将位置指针移到离当前位置50个字节处
fseek(fp,10L, 2);
将位置指针从文件末尾处向后退10个字节
*/
#include <stdio.h>
#include <stdlib.h>
struct student
{
char name[10];
int num;
int age;
char addr[15];
}boy;
void main()
{
FILE *fp;
int i=1; //用于定位第 i 个结构
if( !(fp = fopen("student-list", "r")) )
{
printf("Cannot open the file!\n");
return;
}
rewind(fp); //设置文件内部指针指向文件头
fseek(fp, i*sizeof(struct student), 0); // fseek(文件类型指针, 位移量, 起始点);
fread(&boy, sizeof(struct student), 1, fp); //数据块读写函数:freed : fread(buffer, size, count, fp);
//读取一个学生的容量
/*
参数说明:
buffer: 是一个指针
对fread来说,它是读入数据的存放地址
对fwrite来说,是要输出数据的地址(均指起始地址)
size: 要读写的字节数
count:要进行读写多少个size字节的数据项
fp:文件指针
*/
printf("name number age addr\n");
printf("%s %5d %7d %s\n", boy.name, boy.age, boy.addr);
}
/*
2011年09月25日22 :02:36
功能:
函数的调用形式:
fseek(文件类型指针, 位移量, 起始点);
参数:
起始点:
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
例如:
fseek(fp, 100L, 0);
将位置指针移到离文件头100个字节处
fseek(fp,50L, 1);
将位置指针移到离当前位置50个字节处
fseek(fp,10L, 2);
将位置指针从文件末尾处向后退10个字节
*/
#include <stdio.h>
#include <stdlib.h>
struct student
{
long num;
char name[10];
int age;
}s[10];
int main(void)
{
FILE *fp;
int i;
struct student stu;
if( (fp=(fopen("student.dat", "w+"))) == NULL )
exit(0);
for(i=0; i<10; i++)
{
printf("第%d个学生:\n", i+1);
printf("学号:");
scanf("%ld", &s[i].num);
printf("姓名:");
scanf("%s", s[i].name);
printf("年龄:");
scanf("%d", &s[i].age);
}
fwrite(s, sizeof(struct student), 10, fp);
for(i=1; i<=9; i=i+2)
{
fseek(fp, (i-1)*sizeof(struct student), SEEK_SET);
fread(&stu, sizeof(struct student), 1, fp);
printf("%ld %s %d", stu.num, stu.name, stu.age);
}
fclose(fp);
return 0;
}
文件定位:
文件中有一个位置指针,指向当前读写的位置,如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他指定的位置。可以用下面介绍的有关函数实现上述功能:
1、rewind函数
rewind函数的作用是使指针重新返回文件的开头,此函数没有返回值
/*
2011年09月25日20 :28:38
功能:
将stuendt.txt文件中的内容读取出来显示在屏幕上
然后将stuendt.txt中的内容复制到stuendt2.txt文件中
注意:
rewind函数的作用是使指针重新返回文件的开头,此函数没有返回值
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
FILE * f;
char c;
if( (fp=fopen("stuendt.txt", "r")) == NULL )
exit(0);
c=fgetc(fp);
while(!feof(fp) )
{
// printf("%c", c);
fputc(c, stdout); //以上两种方式都可以将stuendt.txt中的内容打印到屏幕上 stdout函数就是将内容显示在屏幕上
c=fgetc(fp);
}
if( (f=fopen("stuendt2.txt", "w")) == NULL )
exit(0);
rewind(fp); // rewind函数的作用是使指针重新返回文件的开头,此函数没有返回值
while(!feof(fp) )
{
fputc(c, f); //当向stuendt2.txt中写入一个字符后文件内部指针就会自动指向后一个字节
c=fgetc(fp);
}
fclose(fp);
fclose(f);
return 0;
}
ftell函数:
long ftell( FILE *stream );
函数作用:
得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
返回值:
返回当前位置,出错时返回-1L。
应用举例:
i = ftell(fp);
if( i == -1L)
printf("error\n");
/*
2011年09月26日19 :14:34
功能:
函数格式:
long ftell( FILE *stream );
函数作用:
得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
返回值:
返回当前位置,出错时返回-1L
*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * stream;
long position;
char list[100];
if( (stream = fopen("我把的后缀换成zip.gif", "rb")) != NULL )
{
fread(list, sizeof(char), 100, stream); // fread(buffer, size, count, fp); 从“我把的后缀换成zip.gif”文件中读取100个字节放到list中 此时文件内部指针指向的位置由 long ftell( FILE *stream ); 来判断
position = ftell(stream); //long ftell( FILE *stream ); 得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
printf("Position after trying to read 100 bytes: %ld\n", position);
fclose(stream);
}
return 0;
}
出错的检测
ferror函数
调用形式:
ferror(fp);
返回值:
返回0,表示未出错;返回非0,表示出错
注意:
在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动设置为0;
/*
2011年09月26日19 :36:31
功能:
调用形式:
ferror(fp);
返回值:
返回0,表示未出错;返回非0,表示出错
注意:
在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动设置为0;
注意:
1、在读取文件时可能返回的字节数比实际文件的字节要小也可能相等
2、当要小的时候,是因为在文件中有换行符 在文件中换行符占两个字节,但fread函数在读取换行符的时候 会将换行符所占的两个字节读取成一个字节
3、当文件中只有一行数据,并且也不存在换行符,此时读取的字节数就等于文件所占的字节
*/
#include <stdio.h>
#include <stdlib.h>
void main( void )
{
int count, total = 0;
char buffer[100];
FILE *stream;
if( (stream = fopen( "qintangtao.txt", "r" )) == NULL )
exit( 1 );
/* Cycle until end of file reached: */
while( !feof( stream ) )
{
/* Attempt to read in 10 bytes: */
count = fread( buffer, sizeof( char ), 100, stream ); //fread函数可以读取二进制文件 也可以读文本文件
if( ferror( stream ) ) //int ferror( FILE *stream ); 返回0,表示未出错;返回非0,表示出错
{
perror( "Read error" );
break;
}
/* Total up actual bytes read */
total += count;
}
printf( "Number of bytes read = %d\n", total );
fclose( stream );
}
clearerr函数
void clearerr( FILE *stream );
调用形式:
clearerr(fp);
函数作用:
使文件错误标志和文件结束标志设置为0
注意:
只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数
/*
2011年09月26日20 :12:18
功能:
void clearerr( FILE *stream );
调用形式:
clearerr(fp);
函数作用:
使文件错误标志和文件结束标志设置为0
注意:
只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数
*/
#include <stdio.h>
void main( void )
{
int c;
/* Create an error by writing to standard input. */
putc( 'c', stdin );
if( ferror( stdin ) )
{
perror( "Write error" );
clearerr( stdin ); //当出现错误时 用clearerr清除错误
}
/* See if read causes an error. */
printf( "Will input cause an error? " );
c = getc( stdin );
if( ferror( stdin ) )
{
perror( "Read error" );
clearerr( stdin );
}
}
以上函数都要求包含头文件stdio.h
文件操作小结:
分类 |
函数名 |
功能 |
打开文件 |
fopen() |
打开文件 |
关闭文件 |
fclose() |
关闭文件 |
文件定位 |
fseek() |
改变文件位置指针的位置 |
rewind() |
使文件位置指针重新至于文件开头 |
|
ftell() |
返回未见位置指针的当前值 |
|
文件状态 |
feof() |
若到文件末尾,函数值为真 |
ferror() |
若对文件操作出错,函数值为真 |
|
clearerr() |
使ferror和feof函数值置零 |
|
文件读写 |
fgetc(), getc() |
从指定文件取得一个字符 |
fputc(), putc() |
把字符输出到指定文件 |
|
fgets() |
从指定文件读取字符串 |
|
fputs() |
把字符串输出到指定文件 |
|
getw() |
从指定文件读取一个字(int型) |
|
putw() |
把一个字输出到指定文件 |
|
fread() |
从指定文件中读取数据项 |
|
fwrite() |
把数据项写到指定文件中 |
|
fscanf() |
从指定文件按格式输入数据 |
|
fprintf() |
按指定格式将数据写到指定文件中 |
C\C++ 关于FILE结构定义说明
此结构VC定义于stdio.h头文件中,
struct _iobuf
{
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(应该是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件的大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;