这几天在做个将学生成绩进行分组,并且使每组的平均分都相近的程序,里面涉及到一些对文件的读,写等基本操作,因此在这做个总结,将这方面的知识巩固一下.
对文件的读取
先定义一个文件指针,然后利用fopen函数将指针指向文件.
关于fopen()函数:
功能:打开一个流
用法:FILE *open(char *filename,char *type);//tpye为打开类型
FIlE *fp;
fp = fopen("average.txt","r");
关于type:
“r” : 只读,如果文件不存在函数将返回一个空指针NULL
“w” : 只写,如果文件不存在将自动创建一个文件,如果存在则会删除原文件再创建一个新文件
“r+”: 既可读又可写
“w+”: 既可读又可写
“a” : 向文本末添加数据
“a+”: 既可读又可再文本末添加数据
“rb”: 只读方式打开一个2进制文件
“wb”: 只写方式打开一个2进制文件
“rb+”: 既可读又可写打开一个2进制文件
“wb+”: 既可读又可写打开一个2进制文件
“ab”: 向2进制文件末添加数据
“ab+”: 可读又可向2进制文件添加数据
关闭文件
通常我们打开了一个文件再用完后都需要关闭,此时用库函数fclose()
关于fclose():
功能:关闭一个流
用法:int fclose(FIILE *stream);
FIlE *fp;
fp = fopen("average.txt","r");
fclose(fp);
读取文件内容
用库函数fgets()
关于fgets():
功能:从流中读取一字符串
用法:char *fgets(char *string,int n,FILE *stream);//读取n-1个字符到string中
说明:当n小于或者等于一行的字符串长度时,读取长度为n-1结束,当n-1大于字符串长度时读取到’\n’或者EOF结束,每次读取完指针都会自动加1,指向下一个位置.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp;
fp = fopen("f.txt","r");
char str[100];
char str2[100];
fgets(str,5,fp);//字符串长度大于n
fgets(str2,500,fp);//字符串长度小于n
printf("str=%s,len=%d\n",str,strlen(str));
printf("str2=%s,len=%d\n",str2,strlen(str2));//因为指针先读取了长度为4的字符串存放再str中,此时再读取字符串时将从第5个字符(起始长度为1不是0)开始 ,遇到'\n'或者EOF结束
fclose(fp);
}
文件f:
运行结果:
通过fgets函数得到文件所有行的内容:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp;
fp = fopen("f.txt","r");
char str[200];
char contents[4][200];
int j=0;
while(fgets(str,200,fp) != NULL)
{
if(strlen(str) == 1)//去除空行
continue;
for(int i=0; i<strlen(str); i++)
{
contents[j][i] = str[i];
}
j++;
}
for(int i=0; i<j; i++)
printf("第%d行:%s",i+1,contents[i]);
fclose(fp);
}
运行结果:
向文件写入数据
用库函数fprintf()
关于fprintf():
功能:传送格式化输入到一个流中
用法:int printf(FILE *stream,char *format[, arguement,…]);与printf类似
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp;
fp = fopen("f.txt","w");
const char *s = "do you know?\nYes";
fprintf(fp,"%s",s);
fclose(fp);
}
运行结果: