声明:从怎么打开一个文件开始,一步步走,文件指针的操作,读取写入操作等等
我认为百度的资料最准确,所以把百度关于函数的介绍一起引用了过来
1、fopen()
FILE *fp;
//其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。
if((fp=fopen("a.txt","r"))==NULL)
{
printf("\nerror on open a.txt file!");
getch();
exit(1);
}
这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的a.txt文件,则给出提示信息“error on open a.txt file!”
//下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。
2、fscanf()
返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。
3、fseek()
4、rewind()
5、ftell(fp)
用于得到文件位置指针当前位置相对于文件首的偏移字节数
返回-1L,表示调用出错
i=ftell(fp);
if(i==-1L)
printf("error\n");
fseek(fp, 0L,SEEK_END); //指针放在文件尾
len =ftell(fp); //指出指针的位置,即文件字节数,文件大小
#include <stdio.h>
int main(void)
{
FILE *stream;
stream = fopen("MYFILE.TXT", "w+");
fprintf(stream, "This is a test");
printf("The file pointer is at byte \%ld\n", ftell(stream));
fclose(stream);
return 0;
}
6、fputs(str,fp)
7、fgets(buf, bufsize, fp)
函数原型
char *fgets(char *buf, int bufsize, FILE *stream);//注意最多读取的时bufsize-1个字符,最后一个默认放 \0 了;
参数
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的大小。
*stream: 文件结构体指针,将要读取的文件流。
返回值
-
成功,则返回第一个参数buf;
-
在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
#include<stdio.h>
int main()
{
FILE *fp;
char a[30],b[30],c[30];
fp=fopen("3.txt","r+");
fgets(a,6,fp);
printf("%s\n",a);
fgets(b,20,fp);
printf("%s\n",b);
fgets(c,23,fp);
printf("%s",c);
return 0;
}
例:
如果一个文件的当前位置的文本如下
Love, I Have
Since you can do it.
如果用
fgets(str1,6,file1);去读取
则执行后str1 = "Love," ,读取了6-1=5个字符
这个时候再执行fgets(str1,20,file1)则执行后str1 = " I Have\n" 继续读取的原因时缓冲区总是以NULL结尾,没有读完,下一次继续读。!!!!!重点
而如果
fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的'\n',并自动加上字符串结束符'\0'),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。
最后那个A没有读取,因为bufsize只有1,放了\0
注意:空格也是一个字符。
8、fgetc(fp)
#include<stdio.h>
void main()
{
FILE *fp;
int c;
fp=fopen("exist","r");
while((c=fgetc(fp))!=EOF) //用EOF来检验文件末尾*******************************重点
printf("%c",c);
fclose(fp);
}
9、fputc(ch,fp)
#include <stdio.h>
#include <string.h>
int main()
{
FILE*f;
char*s="Hey,Buddy!";
int i;
f=fopen("myFile.txt","w");
for(i=0;i<strlen(s);i++)
{
fputc(s[i],f); //输出到文件
fputc(s[i],stdout); //输出到标准输出
}
fclose(f);
return 0;
}
10、fwrite(buf,size,n,fp)
#include <stdio.h>
int main ()
{
FILE *fp;
char buffer[] = { 'x' , 'y' , 'z' };
fp = fopen ( "myfile.bin" , "wb" );
fwrite (buffer , sizeof(char), sizeof(buffer) , fp );
fclose (fp);
return 0;
}
11、fread(buf,size,n,fp)
#include<stdio.h>
#include<string.h>
int main(void)
{
FILE *stream;
char msg[]="this is a test";
char buf[20];
if((stream=fopen("myfile.txt","w+"))==NULL)
{
fprintf(stderr,"Can not open output file.\n");
return 0;
}
fwrite(msg, 1, strlen(msg)+1, stream); //把msg的东西写入文件
fseek(stream,0L,SEEK_SET); //因为上一部,要重新把文件指针放在文件的开头
fread(buf,strlen(msg)+1,1,stream); //再从文件读取放入msg
printf("%s\n",buf);
fclose(stream);
return 0;
}
12、fflush(fp)
fopen fseek fputs fprintf fscanf 一起使用的例子
#include <cstdio>
int main()
{
FILE* fp;
int i = 617;
char* s = "that is a good new";
fp = fopen("2.txt", "w+"); //读写打开,会覆盖
/*这里用的fputs向文件输入字符串,没有用fprintf*/
fputs("total", fp); //向文件中输入字符串, 不会自动加\0, fp在后面
fputs(":", fp);
/*这里用了fprintf但是却一次输入一个*/
fprintf(fp, "%d\n", i); //要自己加一个\n
fprintf(fp, "%s", s); //字符串自己做变量名,也作地址用
char a[20],b[20],c[20],d[20],e[20];
fseek(fp,9L,0); //偏移9个字节
fscanf(fp,"%s %s %s %s %s",a,b,c,d,e);
printf("%s %s %s %s %s",a,b,c,d,e);
fclose(fp);
return 0;
}