文件的打开模板
FILE *fp;
if((fp=fopen("文件地址.txt","w(打开方式)")==MULL)
return 2;
打开方式分为w/r/wb/rb,分别为写,读,二进制的写读(以文件为对象)
只需要读取文件中的内容,不对其进行改变就r;
需要对文件中内容改变,或写入东西就w。
写入,读取文件的几种方法,及使用情况。
若要从外界即键盘输入,需先gets(str) str存入一个字符串中,方便后续写入文件
# 1. fputc与fgetc(putc与getc与其用法完全一致)
写入是fputc数据从内存写入磁盘(即写入文件),对于内存来说是出去。
eg:fputc('c',fp); 将一个字符c输入文件(文件已定义好)
输出是fgetc数据从磁盘进入内存,这样才能输出。(输出:输出的只能是内存中的东西)
eg:fgetc(fp); (因为是每次一个字符所以没必要再规定读取字符大小,只给函数一个文件地址即fp即可)
不管是fgetc还是fputc都要从我是内存的角度考虑,对内存是得到就是get,是输出就是put
同理:
# 2. 写入 fputs("abcde",pf1) 写入字符串
输出可以先用定义一个字符串arr(已初始化),输出: fgets (arr,n,pf1); (已知字符串长度)
fgets: 从pf1相关的文件中读取长度为n-1的字符串,并储存到arr中,到文件末尾或出错返回NULL。
输出一行(不出现回车)所有字符则用(要确定要输出的字符串大小,若要输出好几行且每行长度不同,字符串长度会由输入的最后一行字符串决定,导致输出格式错误,推荐使用下一种输出格式,fscanf不用考虑要输出字符串的长度。
while(fgets(arr,strlen(arr)+1,pf1)!=NULL)
{
printf("%s",arr);
printf("\n");//输出字符串后换行
}
# 3. fprintf为写入文件
eg:fprintf(pf1,%d %f,i,f);
fscanf为输出(要取地址符号)
fscanf(pf1,%d %f,&i,&j);
fscanf : 从fp相关文件中读取字指定格式的数据(%d,%s等)储存在相关内存单元内(用对应变量地址表示,需要给得到的东西在内存中开辟一块储存空间)
输出文件中所有字符(str本身就是地址)
while(fscanf(fp,"%s",str)!=EOF)//从文件中读出
{
printf("%s ",str);//输出到控制台
printf("\n");
}
对内存是得到就是fscanf(从文件中得到),是输出就是fprintf(输出到文件中)
# 4.fread与fwrite(常与结构体一起使用)
写入文件fwrite(地址,数据长度,数据个数,存到fp文件中)
从指针所指的内存区中读取长度为n的count个数据,存到fp相关的文件中。
fp=fopen("E:\\stud.txt","w");
for(i=0;i<SIZE;i++)
{
fwrite(&stu[i],sizeof(struct Student),1,fp);
printf("学号:%8s 姓名:%8s 成绩1:%4d 成绩2:%4d 成绩3:%4d 平均分:%4.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].avg);
}
从文件中读取fread
for(i=0;fread(&stu[i],sizeof(struct Student),1,fp)!=0;i++)
printf("\n%8s%8s",stu[i].num,stu[i].name);
//读取后即可直接输出到控制台上。
关闭文件
fclose(fp);
要记住每种函数需要参数的种类,给出顺序,及不对时的返回值(NILL/EOF)
小练一下,分析下段代码:
从键盘输入若干行字符(每行长度不一样),输入后把它们存储到一个磁盘文件里,再从该文件中读入这些数据,将其中的小写字母转换成大写字母后在显示屏上输出
*/
int main()
{
FILE *fp;
char str[100],ch;
int i=0;
if((fp=fopen("E:\\zifu.txt","wb"))==NULL)
{
printf("zifu.txt file cannot open!\n");
exit(0);
}
while(1)
{
printf("请输入字符:");
gets(str);
fputs(str,fp);
fputs("\n",fp);
printf("\ncontinue?(Y/N)");
ch=getchar();
if(ch=='n'||ch=='N')
break;
getchar();
}
fclose(fp);
fp=fopen("E:\\zifu.txt","rb");
while(fscanf(fp,"%s",str)!=EOF)
{
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='a'&&str[i]<='z')
str[i]-=32;
}
printf("%s\n",str);
}
return 0;
}