第二十二讲 文件的读取

        今天我们要说的是文件的操作,一直在黑乎乎的控制台上操作想必大家都厌烦了,心想是不是可以把信息写在txt等文件里面呢?当然是可以的,接下来我们就说说文件的读写。
大家还记得我们在开始说gets()这个函数的时候我们顺便便说了一个fgets()吗?当时我们说这个函数是gets的文件版本,而且是一个安全版本,当时我们没有细说,留待以后再说,今天该是我们说这个函数的时候了,不过在说这个函数之前,我们先来看看fopen()。
fopen()顾名思义就是open file的意思,他是以文件名为参数,同时返回一个指向文件结构的指针。例如我们要是想要打开一个名为“lizi.txt”的文件,我们以读写模式来打开。
———————–
FILE * fp;
fp = fopen(“lizi.txt”,”r|w”);


————————
通常情况下,我们要判断我们要开打的文件是否被打开,如果打开,fopen便是指向FILE的指针,如果打开失败,便返回一个空指针。
还记得我们的fgets()函数的原型吗?他的第三个参数就是一个FILE的指针,所以当得到这个指针之后,我们便可以将该指针传递给fgets,然后就能够读取该打开文件的内容了。
和fgets匹配的便是fputs,我们可以将这个fgets读取的字符串通过fputs输出,可以在标准框里输入,也可以把他输入指定的文件之中。我们来看看下面的这个例子:
————————————–
#include <stdlib.h>#include <stdio.h>int main()
{
char ch[20];

FILE *file;

file = fopen(“lizi.txt”,”r”);

if(file == NULL)
printf(“打开文件失败.n”);

fgets(ch,20,file);

fputs(ch,stdout);

system(“PAUSE”);

return 0;

}
—————————————–
我们在该程序的文件里建发文本文档,然后命名为“lizi”,然后在里面输入Hello world。然后我们运行程序,可以看到标准输出Hello world。大家如果有兴趣,可以尝试一下其他的。
大家尝试过之后可能会问,为什么只能读取第一行呢?是啊,问题出在那里呢?我们再来看看fgets()这个函数吧。
fgets()他可以读取一连串的字符串,但是会在碰到回车后停止读取,所以他读取我们的第一行。那么有没有办法让把整个文件读完呢?答案是肯定的,我们可以通过使用一个循环来完成,但是大家是不是又想问,用循环的话那怎么控制循环呢?
每个文件都有一个结尾符,便是End Of File,在C/C++里,我们称它为EOF,而fgets同样不例外,在遇到eof之后便不会再读取了,所以我们便利用这一点来控制这个循环。又由于fgets()返回一个指向char的指针,这将和eof类型不同,在这里我们不能强制转换,如果你要是转换,那就是出大事了,既然不能转换的话该怎么办呢?我们可以这么想,如果fgets()没东西可以读取,那么返回的岂不是NULL指针吗?所以我们将程序这么改一下:
————————————
#include <stdlib.h>#include <stdio.h>int main()
{
char ch[20];

FILE *file;

file = fopen(“lizi.txt”,”r”);

if(file == NULL)
printf(“打开文件失败.n”);

while(fgets(ch,20,file) != NULL)
fputs(ch,stdout);

system(“PAUSE”);

return 0;

}
—————————————–
我们这样一修改,就能够读取所有的内容了。
那么,我们要怎么才能将文件写入另一个文件呢?大家还记得fputs()的第二参数是什么吗?
fputs的第二个参数便是FILE的指针,所以我们可以创建一个文本文件,然后把指向他的指针传递给fputs(),便可以把文件信息写入该文本。怎么获得这个指针呢?我们依然可以用fopen()这个函数来获得该指针。
———————————–
FILE *file2;
file2 = fopen(“write”,”w”);


————————————
fopen的第二个参数现在是w,这个w的意义是打开一个文件用来进行更新写操作,第一个参数是要打开的文件名,当然如果不存在该文件的话,便会创建该文件。所以如果要想把文件从一个文本写入另一个文本之中,我们可以把上面的代码修改一下即可,如下:
 

————————————
#include <stdlib.h>#include <stdio.h>int main()
{
char ch[20];

FILE *file;


     FILE* file2;
file = fopen(“lizi.txt”,”r”);


     file2 = fopen(“write.txt”,”w”);

if(file == NULL)
printf(“打开文件失败.n”);

while(fgets(ch,20,file) != NULL)
fputs(ch,file2);

system(“PAUSE”);

return 0;

}
—————————————–
再次运行便会发现在我们的目录下多了一个名叫write的文本文件,打开看一下会发现里面的内容和我们原文件相同。
说到此处,那么我们怎么才能运行期打开一个文本文件呢?为了更好的说明这种使用法,我们来看下面的例子:
————————————
#include <stdlib.h>#include <stdio.h>int main()
{
char ch[20],name1[20],name2[20];

FILE *file;


     FILE* file2;
     puts(“请输入要打开的文本文件:”);


     gets(name1);

puts(“请输入要写入的文件名:”);

gets(name2);


     file = fopen(name1,”r”);


     file2 = fopen(name2,”w”);

if(file == NULL)
puts(“打开文件失败.”);

while(fgets(ch,20,file) != NULL)
fputs(ch,file2);

system(“PAUSE”);

return 0;

}
————————————
在输入文件名时记得带上路径,比如说如果我们想要打开一个D盘下面的文件,我们可以这么写:
D:\lizi.txt
注意到了吗?我们这里用了两个\,还记得我们以前的那些转义符吗?很多都是要添加一个,我们用得最多的就是换行了n,所以如果我们想要获取一个,那么就要输入两个\。同样对于我们的目标文件,同样还要这么写,不过不添加地址,就会自动在我们的程序目录生成这个文件。
关于文件的读取,今天就说到这里吧,下面还有几个函数呢,我在想是要大家去自己研究呢还是我拿出来说一下呢?我先想想吧。

发表评论