在C文件系统操作的学习中可以与Linux应用程序开发联系起来,Linux应用程序开发中也涉及到了大量的文件操作。可以对此进行比较。
文件的打开与关闭
文件打开:
函数原型:fp=fopen(filename,flags)
说明:如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时open函数将返回一个空指针值NULL(stdio.h中被定义为0),因此可以用如下方法打开一个文件:
if((fp=fopen("file1","r")==NULL)
{
printf("cannot open this file\n");
exit(0);
}
文件关闭:
在使用完一个文件后应该关闭它,以防止它再被误用。
“关闭”就是使文件指针变量不指向该文件。
函数原型:fclose(fp);前面我们曾把打开文件时所带回的指针赋给了fp,现在通过fp把该文件关闭,即fp不再指向该文件。
fclose函数也带回一个值,当顺利地执行了关闭操作,则返回值为0;否则返回eof(-1).
拓展与比较:
在Linux的文件变量有两种方法可以实现:
1)依赖于Linux操作系统的Linux系统调用方式
2)C语言库函数;其实与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法是相同的
比较:
1)系统调用的方式:
文件描述符:在Linux系统中,所有打开的文件都有一个文件描述符。文件描述的本质是一个非负整数,当打开一个文件时,该整数由系统分配。
系统调用的接口:
文件打开:
<span style="font-family:KaiTi_GB2312;font-size:18px;">int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode)</span>
文件关闭:
<span style="font-family:KaiTi_GB2312;font-size:18px;">int close (int fd);//fd是文件描述符</span>
2)库函数:
文件打开:
<span style="font-family:KaiTi_GB2312;font-size:18px;">FILE *fopen(const char* filename,const char *mode);
</span>
文件关闭:
<span style="font-family:KaiTi_GB2312;font-size:18px;">int fclose(int fd);</span>
文件的读写
常用的读写函数有如下所示:
fputc函数
函数原型:fputc(ch,fp);
函数意义:ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量。fputc(ch,fp)函数的作用是:将字符ch输出到fp所指向的文件中去。fputc函数也带回一个值:如果输出成功,则返回值就是输出字符;如果输出失败,则返回一个EOF;
fgetc函数
函数原型:ch=fgetc(fp);
函数意义:从指定的文件读入一个字符,该文件必须是以读或者读写的方式打开
fp是文件型指针变量,ch为字符型变量
fgetc函数带回一个字符,赋给ch。如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标致EOF(-1)。
e.g1:从一个磁盘文件顺序读入字符并在屏幕上显示出来
ch=fgetc(fp);
while(ch!=EOF)
{putchar(ch);
ch=fgetc(fp);
}
拓展与补充:字符数据的输入与输出
C语言本身不提供输入输出语句,输入与输出操作是由C函数库中的函数来实现的。不把输入输出作为C语句的目的是使C语言编译系统简单,没有输入输出语句就可以避免在编译阶段处理与硬件相关的问题。
putchar函数:就是向终端输出一个字符
函数原型:putchar(c);
getchar函数:从终端输入一个字符
函数原型:getchar();函数没有参数
putchar与fputc的关系:
putchar是从函数fputc派生出来的,putchar(c)是在stdio.h文件中用预处理命令#define定义的宏
# define putchar(c) fputc(c,stdout);
关于stdout、stdin、stdout
在程序运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出。通常这3个文件都与终端相联系。因此我们所用到的从终端输入或输出都不需要打开终端文件。
系统自动定义了3个文件指针stdin、stdout、stderr;分别指向终端输入、终端输出和标准出错输出
实例1:从键盘输入一些字符,逐个把他们送到磁盘上去,直到输入一个“#”为止。(也是Linux下的文件编程)
#include <stdio.h>
#include <stdlib.h>
void main()
{FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w")==NULL)
{printf("cannot open file\n");
exit(0);} //若为NULL,则终止程序
ch=getchar();//用来接受上个语句的回车符
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();//用来接受上个执行语句的回车符
}
putchar(10);//向屏幕输出一个换行符
fclose(fp);
}
fread函数和fwrite函数
getc和putc函数可以用来读写文件中的一个字符。但常常要求读入一组数据,这时候就利用提供的fread和fwrite两个函数来操作。
函数原型:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
说明:buffer是一个指针,对于fread来说,它是读入数据的存放地址,对于fwrite来说,是要输出数据的地址。
size:要读写的字节数
count:读多少个size字节的数据项
fscanf函数和fprintf函数
fscanf函数、fprintf函数与scanf函数、printf函数有什么区别?
其实他们都是格式化读写函数,只是fscanf函数和fprintf函数的读写对象不是终端而是磁盘文件。
函数原型:
fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输入列表);
其他的一些函数:putw、getw、fgets、fputs
putw(10,fp):从磁盘文件读写一个字(整数)
i=getw(fp):从磁盘文件中读一个整数到内存,赋给整型变量i
fgets与fputs:从指定文件中读入或写入一个字符串
函数原型:fgets(str,n,fp);
fputs("china",fp);
文件定位
文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符以后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他所指定的位置。
rewind函数:
函数原型:rewind(fp);
函数意义:使位置指针重新返回文件的开头,此函数没有返回值。
fseek函数:
函数原型:int fseek(FILE*stream,long offset,int origin);
函数功能:stream:文件指针
offset:偏移量,正数表示正向便宜,负数表示负向偏移
origin:设定文件从哪里开始偏移,可能取值有SEEK_CUR:文件开头,SEEK_END:文件结尾,SEEK_SET:文件开头。
ftell函数
函数功能:得到流式文件中的当前位置,用相对于文件开头的位移量表示。