C Primer Plus学习 四十一 fopen ()函数

来源:互联网 发布:毛棕榈油的用途知乎 编辑:程序博客网 时间:2024/05/25 23:29

fopen ()函数

       这一函数在stdiah中声明。它的第一个参数是要打开的文件名;更确切地说,是包含该文件名的字符串的地址。第二个参数是用于指定文件打开模式的个字符串 C库提供了一些可能的模式,如表13.1。


       fopen ()函数返回一个文件指针(file pointer),其他I/O函数用这个 指针来指定该文件。文件指针(比如这个例子中的fp)是…种指向FILE的指针;FILE是stdio.h中定义的 一种派生类型。指针fp并不指向实际的文件,而是指向一个关于文件的信息的数据包,其中包括文件I/O 使用的缓冲区信息。因为标准库中的I/O函数使用缓冲区,所以它们需要知道缓冲区的位置,还需要知道 缓冲R的当前缓冲能力以及所使用的文件。这样这些函数在必要的时候可以再次填充或者清空缓冲区。fp 指向的数据包中包含全部这些信息。

       如果不能打开文件,fopen ()函数返回空指针(也是在stdio.h中定义的)。如果fp为NULL,程序 将退出。磁盘己满、文件名非法、存取权限不够或者硬件问题等都会导致fopen ()函数执行失畋。这就 需要査找故障,一个小问题的查找也可能颇费周折。

/* count.c --使用标准 I/O*/
#include<stdio.h>
#include<stdlib.h>// ANSI C 的 exit ()原型
int main(int argc,char *argv[])
{
int ch;                  //读取时存储每个字符的位置
FILE *fp;                //文件指针
long count=0;
if(argc!=2)
{
printf("Usage:%s filename\n",argv[0]);
exit(1);
}
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("Can't open %s\n",argv[1]);
exit(1);
}
/*
fp=fopen("d:\\dome\\dome13\\ad.txt","r");
if(fp==NULL)
{
printf("Can't open %s\n","d:\dome\dome13\ad.txt");
exit(1);
}
*/
while((ch=getc(fp))!=EOF)
{
putc(ch,stdout);//相当于 putchar
count++;
}
fclose(fp);
printf("\nFile %s has %ld characters\n",argv[1],count);

return 0;
}
输出结果:



1是让程序运行,2是文件的地址。

getc ()函数和 putc ()函数

        这两个函数的工作方式和函数getchar (.)与putchar ()非常相似,不同之处在于您需要告诉getc () 和putc ()函数它们要使用的文件。所以,下面的方法从标准输入获得一个字符:
ch = getchar ();
       但下面的语句表示从指针fp指定的文件中获得一个字符:
ch = getc (fp);
       与之类似,以下语句表示将字符ch写入到FILE指针fpout指定的文件中:
putc (ch. fpout):
        在putc ()函数的参数表中,首先是字符,然后是文件指针。
        程序清单13•丨把stdout作为putc ()函数的第二个参数„ stdout是在stdio.h中定义的与标准输出相关 联的文件指针,所以putc (ch, stdout)和putchar (ch)的作用是一样的。实际上,后者一般通过前者定 义。类似地,getchar ()使用作为标准输入的getc ()定义。
       既然这样,为什么这个例子中要使用putc ()代替putchar ()呢?个原因就是要介绍putc ()函数, 另一个原因是通过使用stdom之外的参数,可以很容易地将这段程序改写为向文件进行输出。







0 0
原创粉丝点击