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既是表示二进制,意义和上面一样。