文件分类
1、文本文件、二进制文件
2、普通文件、设备文件(显示器、打印机、键盘等)
3、源文件、目标文件、可执行文件、头文件、数据文件
在c语言中,对文件操作由库函数完成
FILE 文件类型,构造类型,系统提供的结构体
文件指针 FILE *f1;
打开文件
/*
打开文件语法格式
FILE *fopen(char *filename,char *mode);
按照指定的模式打开文件
mode 打开模式的字符串
“r”:只读
“w”:只写
“a”:追加
“rb”:对二进制只读
“wb”:二进制只写
“ab”:二进制追加
“r+”:可读写
“w+”:打开或新建文件
“a+”:打开文件,可读,也可以追加
返回值问题:如果打开文件成功,则获取对应地址,否则返回NULL
*/
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char ch;
fp = fopen("01-文件分类.txt","r");
if(fp == NULL){
printf("不能打开文件\n");
exit(0);
}
ch = fgetc(fp);//从文件中获取一个字符
while(ch != EOF){//EOF系统定义的文件结束符
printf("%c\n",ch);
ch = fgetc(fp);
}
fclose(fp);//操作完文件之后,一定要关闭文件
return 0;
}
打开文件写入内容
//键盘输入一个字符串,以#号结束,存入文件中
#include <stdio.h>
int main(){
FILE *fp;
char ch;
if((fp = fopen("03.txt","w+")) == NULL){
printf("不能打开文件\n");
return 0;
}
printf("键盘输入一个字符串,以#号结束并回车:");
ch = getchar();
while(ch ! = '#'){
fputc(ch,fp);//把ch变量中的内容输出到文件中
ch = getchar();
}
fclose(fp);
return 0;
}
打开文件读出内容并输出终端
#include <stdio.h>
int main(){
FILE *fp;
if((fp = fopen("03.txt","r"))==NULL){
printf("不能打开文件!");
}else{
char ch = fgetc(fp);
while( ch != EOF){
putchar(ch);
ch = fgetc(fp);
}
fclose(fp);
}
return 0;
}
fputs:向指向的文件中输出一个字符串,字符串写入文件中
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char fileName[30],str[50];
printf("请输入一个文件:");
scanf("%s",fileName);
if((fp = fopen(fileName,"w"))==NULL){
printf("打开失败\n");
printf("按任意键继续........");
getchar();
exit(0);
}
printf("请输入一个字符串");
getchar();//消化多余的回车符。接收输入文件名后的那个回车符
gets(str);
fputs(str,fp);//把str字符串写入文件fp中
fclose(fp);
return 0;
}
fgets (输入到字符串,输入多少字符数,文件指针变量)
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char filename[30],str[5];
printf("请输入一个文件名:");
scanf("%s",filename);
if((fp = fopen(filename,"r"))==NULL){
printf("打开失败!\n");
printf("按任意键继续......");
getchar();
exit(0);
}
fgets(str,sizeof str,fp);//读取文件中的若干字符存入str数组中
printf("%s\n",str);
return 0;
}
fprintf();
/*
格式化字符串对应的内容输出到文件
语法格式:
length = fprintf(文件,格式化字符串,输出列表);
*/
#include <stdio.h>
int main(){
FILE *fp;
int i = 65;
if((fp = fopen("07.txt","w"))==NULL){
printf("打开文件失败\n");
return 0;
}
k = fprintf(fp,"%d,%d",i,i);
printf("k=%d\n",k);
fclose(fp);
return 0;
}
#include <stdio.h>
int main(){
FILE *fp;
int i = 65,k;
if((fp = fopen("08.txt","w"))==NULL){
printf("打开文件失败!\n");
return 0;
}
k = fprintf(fp,"%c,%c",i,i);
printf("k=%d\n",k);
fclose(fp);
return 0;
}
fscanf(文件,格式化字符串,输入列表)
读取文件中对应的信息
#include <stdio.h>
int main(){
FILE *fp;
int i,k;
if((fp = fopen("07.txt","r"))==NULL){
printf("打开文件失败\n");
return 0;
}
fscanf(fp,"%d,%d",&i,&k);
printf("i=%d,k=%d\n",i,k);
fclose(fp);
return 0;
}
fread
/*
1、读文件内容到内存变量buffer中
fread(buffer,size,count,fp)
fread(存数据的指针变量地址,字节数,次数,文件指针)
2、把内存变量buffer中的内容写入文件中
fwrite(buffer,size,count,fp)
*/
//先把通讯录信息写入文件,再读出打印出来
#include <stdio.h>
#include <stdlib.h>
struct addressList{
char name[30];
char address[50];
char phoneTel[11];
} info[10];
//写入n条通讯录
void save(char *filename,int n){
FILE *fp;
int i;
if((fp = fopen(filename,"wb"))==NULL){
printf("打开失败!!");
exit(0);
}
for(i = 0;i < n;i++){
if(fwrite(&info[i],(sizeof(struct addressList)),1,fp)!=1){
printf("文件写入出错!!\n");
}
}
fclose(fp);
}
void show(char *filename,int n){
int i;
FILE *fp;
if((fp = fopen(filename,"rb"))==NULL){
printf("打开文件失败!\n");
exit(0);
}
for(i = 0;i < n;i++){
struct addressList temp;
fread(&temp,(sizeof(struct addressList)),1,fp);
printf("姓名:%s\n地址:%s\n手机号:%s\n",temp.name,temp.address,temp.phoneTel);
}
fclose(fp);
}
int main(){
int i,n;
char filename[50];
printf("录入通讯录的条数:");
scanf("%d",&n);
printf("输入通讯录要保存到的文件名:");
scanf("%s",filename);
for(i = 0;i < n;i++){
printf("请输入第%d条通讯录的姓名、地址、电话:\n",i+1);
scanf("%s%s%s",info[i].name,info[i].address,info[i].phoneTel);
}
save(filename,n);
show(filename,n);
return 0;
}
文件定位操作函数
/*
1、fseek函数
fseek(文件类型指针,偏移量,起始点)
起始点可以是文件头(0)、文件尾(2)、当前位置(1)
fseek(fp,-20L,2);
//以上代码表示:把文件内部位置指针从文件尾后退20个字节
2、rewind函数
rewind(fp):把文件内部位置指针移到文件头
3、ftell函数
获取文件内部位置指针的当前位置,如果位置在文件尾,则获取到文件总长度。
*/
#include <stdio.h>
int main(){
return 0;
}
fseek
//fseek(文件类型指针,位移量,起始点);
//把文件内部定位位置的指针从指定的起始点移动若干字节(位移量)
//指定的起始点有三种:开头(0)、当前位置(1)、结尾(2)
// SEEK_SET SEEK_CUR SEEK_END
/*
向任意一个二进制文件中写入一个长度大于6的字符串,然后从该字符串的第6个字符开始输出剩余的字符。
*/
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char filename[30],str[50];
printf("请输入文件名:");
scanf("%s",filename);
//printf("%s\n",filename);
if((fp = fopen(filename,"wb"))==NULL){
printf("打开文件失败~");
printf("按任意键继续.......");
getchar();
exit(0);
}
printf("请输入一个字符串(长度大于6小于50):");
scanf("%s",str);
//printf("%s\n",str);
fputs(str,fp);
fclose(fp);
if((fp = fopen(filename,"rb"))==NULL){
printf("打开文件失败~");
printf("按任意键继续.......");
getchar();
exit(0);
}
fseek(fp,5L,0);//把文件内部的位置指针指向第6个字节的位置
fgets(str,sizeof(str),fp);
puts(str);
return 0;
}
rewind
//rewind(fp)使文件内部的位置指针指向文件头
//把abc123文件中的内容打印两次
#include <stdio.h>
int main(){
FILE *fp;
char ch;
fp = fopen("abc123","rb");
ch = fgetc(fp);
while(ch != EOF){
putchar(ch);
ch = fgetc(fp);
}
printf("\n");
//rewind(fp);//让文件内部的位置指针指向了文件头
fseek(fp,0,0);//此用法 与 rewind(fp)功能相同
ch = fgetc(fp);
while(ch != EOF){
putchar(ch);
ch = fgetc(fp);
}
printf("\n");
return 0;
}
ftell
//ftell(fp):返回文件内部的位置指针的当前位置,从文件头开始计算。返回-1表示出错。
//通过此函数可以求字符串长度
#include <stdio.h>
int main(){
FILE *fp;
char ch;
long length;
fp = fopen("abc123","rb");
ch = fgetc(fp);
while(ch != EOF){
putchar(ch);
ch = fgetc(fp);
}
printf("\n");
length = ftell(fp);
printf("文件的总字符数,即字符串长度为:%ld\n",length);
fclose(fp);
return 0;
}