第二十三讲 再说文件的操作

       昨天我们说了文件的读取和写入,不过我们只说了一对函数,关于文本文件的操作的函数很多,我本来不打算多说的,不过想了写,既然都把fgets和fputs都说了,如果不说fscanf和fprintf的话是不是有点过分了呢?于是心想,今天就用一讲的课程来说说这两个函数。
printf和scanf我们一开始就接触了,对于这两个函数再熟悉不过,不过我想告诉大家,这两个函数的变形有很多种,sprintf,sscanf等等都是他们的变形,这两个函数是他们的高级用法,通常都没有多少人去使用,因为有很多种方式可以替代他们,所以如果不是想彰显个人的编程水平的话,我想没人会去使用它们,甚至发觉很多几年工作经验的人竟然都不知道sscanf这个函数,可见他的用处不多。
现在我们要说的fprintf和fscanf,所以关于其他的我就懒得说,我给出了函数了,大家若有兴趣可以自己去谷歌一下。
和fgets和fputs一样,fprintf和fscanf同样需要FILE的指针作为参数,所以我们还是用一个例子来说明这个问题比较适合:
——————————
#include <stdio.h>#include <stdlib.h>
int main()
{
FILE *file1,*file2;

char ch[1000],name1[20],name2[20];

fprintf(stdout,”请输入需要读取的文件名:n”);

fscanf(stdin,”%s”,name1);

fprintf(stdout,”请输入需要写入的文件名:n”);

fscanf(stdin,”%s”,name2);

file1 = fopen(name1,”r”);

file2 = fopen(name2,”w”);

if(file1 == NULL)
fprintf(stdout,”打开文件失败!”);

if(file2 == NULL)
fprintf(stdout,”创建文件失败!”);

while(fscanf(file1,”%s”,ch) == 1)
{
fprintf(stdout,”%s”,ch);

fprintf(file2,”%s”,ch);

}
fclose(file1);

fclose(file2);

system(“PAUSE”);

return 0;

}
————————————-
这个例子,我们可以在标准输出框中看到了文本框的所有内容,但同时我们也发现一个问题,这些内容是密密麻麻的打印出来的,我们再回去看看我们要写入的文件看看,发现里面的内容和我们在标准输出框中的内容一样。
这真是一个棘手的问题啊,不过也不足为奇,还记得我们在开始的时候用scanf读取“hello world”的时候,他只读取了一个hello,所以当时我们为了解决这个问题,于是引进了gets。
通过昨天和今天的对比,我想大家对这两对I/O函数都有所了解了,所以该使用什么大家已经心里有数。
现在我们来说说一下打开文件的模式,也就是来说说fopen这个函数,想要了解一个函数,我们就得先知道他的原型,下面是我们从MSDN上面查到的原型:
—————————

FILE *fopen( 
   const char *filename,
   const char *mode );

—————————–
这个原型很清楚,他的第一个参数就是我们要打开或者是创建的文件名,第二个参数是打开模式,打开模式我们可以有下面几种类型。
————————————–
“r”    打开一个文本文件, 只读模式。
“w”    打开一个文本文件,只写模式,并且先将文件的长度截为零。如果该文件不存在则先创建文件。
“a”    打开一个文本文件,可以写入文件,向已有文件的发问追加内容,如果该文件不存在则先创建文件。
“r+”   打开一个文本文件, 可以进行更新,即可以读取和写入文件。
“w+”   打开一个文本文件, 可以进行更新 (读取和写入), 如果该文件存在则首先将其长度截为零, 如果不在则先创建文件。
“a+”   打开一个文本文件,可以进行更新 (读取和写入), 向已有文件的尾部追加内容,如果该文件不存在则先创建之; 可以读取整个文件, 但写入时只能追加内容。
—————————————
大家可能还会遇到像下面的这种模式:
—————————————-
“rb” “wb” “ab” “ab+” “a+b” “wb+” “w+b” “ab+” “a+b”
—————————————–
这是以二进制的方式操作文件,b既是表示二进制,意义和上面一样。

发表评论