它的第一个参数是待打开文件的名称,第二个参数是一个字符串,指定待打开文件的模式。(下面将会用它打开.cpp和.txt格式的文件)
模式字符串 | 含义 |
---|---|
“r” | 以读模式打开文件 |
“w” | 以写模式打开文件,把现有文件的长度截为0,如果文件不存在,则创建一个新文件 |
“a” | 以写模式打开文件,在现有文件末尾添加内容,如果文件不存在,则创建一个新文件 |
“r+” | 以更新模式打开打开文件(即可以读写文件) |
“w+” | 以更新模式打开打开文件(即读和写),如果文件存在,则将其长度截为0(就是删掉原来的内容!!);如果文件不存在,则创建一个新文件 |
“a+” | 以更新模式打开打开文件(即读和写),在现有文件的末尾添加内容,如果文件不存在则创建一个新文件;可以读整个文件,但是只能从末尾添加内容 |
略 | 略 |
用法:
//这段代码文件名为fille.cpp
#include
int main(void)
{
FILE *fp;
if((fp=fopen("file2.cpp","r"))==NULL)//.cpp可以不带
printf("error");
else
printf("open");
}
效果:
fille.cpp和fille2.cpp需要保存在同一文件中:
fclose(fp)函数关闭fp指定的文件,必要时刷新缓冲区。对于较正式的程序,应该检查是否成功关闭程序。如果关闭成功,fclose()函数返回0,否则返回EOF:
用法:
#include
int main(void)
{
char ch;
FILE *fp;
//fopen()
if((fp=fopen("file2.cpp","r"))==NULL)//.cpp可以不带
printf("error\n");
else
printf("open\n");
//fclose()
if(fclose(fp)==0)
printf("success\n");
else
printf("error\n");
}
下面这条语句的意思是“从fp指定的文件中获取一个字符”
ch=getc(fp);
用法:
#include
int main(void)
{
char ch;
FILE *fp;
//fopen()
if((fp=fopen("file2.cpp","r"))==NULL)//.cpp可以不带
printf("error\n");
else
printf("open\n");
//fclose()
//略
//getc()
while((ch=getc(fp))!=EOF)
printf("%c",ch);
}
下面语句的意思是“把字符ch放入FILE指针fp指定的文件中”:
putc(ch,fp);
用法:
#include
int main(void)
{
char ch;
FILE *fp;
//putc
fp=fopen("file2.cpp","a");//以写模式打开文件
putc('*',fp);
fclose(fp);
fp=fopen("file2.cpp","r");
while((ch=getc(fp))!=EOF)
printf("%c",ch);
}
与printf()函数工作方式类似,fprintf()函数第一个参数为文件指针,而后是格式化列表和字符串,或者只有字符串。
如:
fprintf(fp,"wozhenshuai")
char a[]="wozhenshuai"
fprintf(fp,"%s",a);
fprintf()的第一个参数还可以是指向标准文件的指针:
stdio.h头文件把3个文件指针与3个标准文件相关联,c程序会自动打开这3个标准文件
标准文件 | 文件指针 | 通常使用设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 显示器 |
标准错误 | stderr | 显示器 |
用法:
#include
int main(void)
{
FILE *fp;
char ch;
fp=fopen("F.txt","a+");
fprintf(fp,"shuaibaol");
fclose(fp);//如果不重新关闭打开,会输出很多空格,具体原因不清楚
fp=fopen("F.txt","a+");
while((ch=getc(fp))!=EOF)
{
printf("%c",ch);
}
}
效果:
使用函数前文件内容:
使用后:
若以指向标准文件的指针作为参数,可以理解为硬件设备为一个文件,将字符串输出到屏幕上(stdout和staerr),这个时候fprintf()和printf()用法是一样的,再次不在举例。
fscanf()与scanf()工作方式类似,但fscanf()把FILE指针作为第一个参数。
他将文件中的字符串作为输入传递给变量。
如:
char ch[100];
fscanf(fp,"%s",a);
以指向标准文件的指针作为参数(只有stdin):
char ch[100];
fscanf(stdin,"%40s",a);//只从输入中读取40个字符(或者以回车键提前结束)
用法:
#include
int main(void)
{
FILE *fp;
char ch[1000];
fp=fopen("F.txt","a+");
fscanf(fp,"%s",ch);
puts(ch);
}
#include
int main(void)
{
FILE *fp;
char ch[1000];
// fp=fopen("F.txt","a+");
fscanf(stdin,"%s",ch);
puts(ch);
}
它的第一个参数表示存储输入位置的地址(char*类型);第二个参数是一个整数,表示待输入字符串的大小;最后一个参数是一个指针,指定带读取的文件。(从一个文件中读取字符串,存储到第一个参数指向的内存块中(就是存在一个字符数组里))。
下面是一个调用该函数的例子:
int STLEN=?;
char ch[];
fgets(ch,STLEN,fp);
fgets()函数读取输入直到第一个换行符后面(指以stdin作为最后一个参数的情况),或读到文件结尾,或者读到STLEN-1个字符(以上面的fgets()为例)。然后,fgets()在末尾添加一个空字符使之成为一个字符串。字符串的大小是其字符数加上一个空字符。如果fgets()在读到字符上限之前已读完一行,它会把表示结尾的换行符放在空字符前面。fgets()函数在遇到EOF时将返回NULL值,可以利用这一机制检查是否到达文件结尾;如果为遇到EOF则返回之前传给它的地址。
用法:
#include
int main(void)
{
FILE *fp;
char ch[1000];
fp=fopen("F.txt","a+");
fgets(ch,100,fp);
puts(ch);
}
以指向标准文件的指针作为参数(stdin):
#include
int main(void)
{
FILE *fp;
char ch[1000];
// fp=fopen("F.txt","a+");
fgets(ch,100,stdin);//回车结束
puts(ch);
}
fputs()函数接受两个参数:第一个是字符串地址;第二个是文件指针。该函数根据传入地址找到的字符串写入指定的文件中。和puts()函数不同,fputs()在打印字符串时不会在末尾添加换行符。(将字符串输出到文件中)
下面是使用该函数的例子:
char ch[];
fputs(ch,fp);
由于fgets()保留了换行符。fputs()就不会再添加换行符(就把fgets()获取的换行符直接输出就好了),他们配合的非常好。
用法:
#include
int main(void)
{
FILE *fp;
char ch[]="\nyouxiu";
fp=fopen("F.txt","a+");
fputs(ch,fp);
}
#include
int main(void)
{
FILE *fp;
char ch[]="\nyouxiu";
// fp=fopen("F.txt","a+");
fputs(ch,stdout);
}
fseek()的第一个参数是FILE指针,指向待查找的文件,fopen()应该已打开该文件;fseek()的第二个参数是偏移量。该参数表示从起点开始(起点可以是开头、结尾、和当前位置)要移动的距离(参见下面表格列出的起始点模式)。该参数必须是一个long类型的值,可以为正(前移),负(后移)或0(保持不移动)。fseek的第三个参数是模式,该参数确定起点。根据ANSI标准,在stdio.h头文件中规定了几个模式的明示常量。
模式 | 偏移量的起始点 |
---|---|
SEEK_ SET | 文件开始处 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件末尾 |
下面是调用fseek()函数的一些示例,fp是一个文件指针:
fseek(fp,0L,SEEK_SET)//定位至文件开始处
fseek(fp,10L,SEEk_SET)//定位至文件中第10个字节(关于英文字符和中文字符所占字节数在后面给出)
fseek(fp,2L,SEEK_CUR)//从文件当前位置前移2个字节
fseek(fp,0L,SEEK_END)//定位至文件结尾
fseek(fp,-10L,SEEK_END)//从文件结尾处回退10个字节
如果一切正常,fseek()的返回值为0,如果出现错误(如试图移动的距离超出文件的范围),其返回值为-1。
用法:
#include
int main(void)
{
FILE *fp;
char ch[100];
fp=fopen("F.txt","a+");
fseek(fp,2L,SEEK_SET);
fgets(ch,100,fp);
fputs(ch,stdout);
}
ftell()函数接受一个参数,FILE指针。返回类型是long,它返回的是当前位置(距文件开始处的字节数)。
《c primer plus》中说:ANSIC把他定义在stdio.h中。在最初的实现的UNIX中,ftell()通过返回距文件开始处的字节数来确定文件的位置。文件的第一个字节到文件开始处的距离是 0,以此类推。ANSIC规定,该定义适用于以二进制模式打开的文件,以文件模式打开的文件的情况不同。
(具体啥不同它也没说,我以后查了再写)
用法:
#include
int main(void)
{
FILE *fp;
long last,i;
fp=fopen("F.txt","a+");
fseek(fp,0L,SEEK_END);//当前位置定义到文件结尾处
last=ftell(fp);//获取结尾距离开头的距离(字节数)
for(i=1L;i<=last;i++)
{
fseek(fp,-i,SEEK_END);//从结尾往回走,故需要-号
printf("%c",getc(fp));
}
}
F.txt内容:
注:
UTF-8编码:一个英文字符及标点占一个字节,一个中文(含繁体)字符及标点占3个字节。
ASCII编码:一个英文字符及标点占一个字节,一个中文字符及标点占2个字节。
他是处理大文件的函数,需要使用时自行百度
他是处理大文件的函数,需要使用时自行百度