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
#include
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
#include
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
#include
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
#include
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
#include
#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
#include
#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
#include
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
#include
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
#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
{
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
{
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
#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
{
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
{
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
#include
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 %