目录
1.为什么使用文件
2.什么是文件
2.1 程序文件
2.2 数据文件
2.3 文件名
3.文件的打开和关闭
3.1 文件指针
3.2 文件的打开和关闭
4.文件的顺序读写
5.文件的随机读写
5.1 fseek:根据文件指针的位置和偏移量来定位文件指针。
5.2 ftell:返回文件指针相对于起始位置的偏移量
5.3 rewind 让文件指针的位置回到文件的起始位
6.文本文件和二进制文件
7.文件读取结束的判定
7.1 被错误使用的 feof
8.文件缓冲区
struct _iobuf{char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE
FILE* pf; //文件指针变量
//打开文件
FILE* fopen(const char* filename,const char* mode);
//关闭文件
int fclose(FILE* stream);
int main()
{FILE* pf = fopen("test.dat","w"); //以读的方式打开文件if(pf == NULL){perror("fopen");return 1;}//写文件fclose(pf); //关闭文件pf = NULL;return 0;
}
C语言程序,只要运行起来,就默认打开了3个流
- stdin - 标准输入流 - 键盘
- stdout - 标准输出流 - 屏幕
- stderr - 标准输出流 - 屏幕
举例 fgetc:字符输入
int main()
{FILE* pf = fopen("test.dat","r"); //以读的方式打开文件if(pf == NULL){perror("fopen");return 1;}//读文件int ret = fgetc(pf);printf("%c\n",ret);fclose(pf); //关闭文件pf = NULL;return 0;
}
举例 fputc:字符输出
int main()
{FILE* pf = fopen("test.dat","w"); //以读的方式打开文件if(pf == NULL){perror("fopen");return 1;}//写文件fputc('b',pf);fputc('i',pf);fputc('t',pf);fclose(pf); //关闭文件pf = NULL;return 0;
}
举例 fputs:输入字符串
int main()
{FILE* pf = fopen("test.dat","w");if(pf == NULL){perror("fopen");return 1;}//写入字符串fputs("abcdef\n",pf);fputs("abcdef",pf);//关闭fclose(pf);pf = NULL;return 0;
}
举例 fgets:读取字符串
char *fgets( char *string, int n, FILE *stream );
int main()
{FILE* pf = fopen("test.dat","r");if(pf == NULL){perror("fopen");return 1;}//读取字符串char arr[20] = {0};fgets(arr,4,pf);printf("%s\n",arr);fgets(arr,4,pf);printf("%s\n",arr);//关闭fclose(pf);pf = NULL;return 0;
}
举例 fprintf:格式化输出
struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = {"abcdef",10,5.5f};//对格式化的数据进行写文件FILE* pf = fopen("test.dat","w");if(pf == NULL){perror("fopen");return 1;}//写文件fprintf(pf,"%s %d %f",s.arr,s.num,s.sc);//关闭文件fclose(pf);pf = NULL;return 0;
}
举例 fscanf:格式化输入
struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = { 0 };//对格式化的数据进行读文件FILE* pf = fopen("test.dat","r");if(pf == NULL){perror("fopen");return 1;}//读文件fscanf(pf,"%s %d %f",s.arr,&(s.num),&(s.sc));//打印printf("%s %d %f",s.arr,s.num,s.sc);//关闭文件fclose(pf);pf = NULL;return 0;
}
举例 fwrite:以二进制的方式写
struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = {"abcdef",10,5.5f};//对格式化的数据进行写文件FILE* pf = fopen("test.dat","w");if(pf == NULL){perror("fopen");return 1;}//写文件fwrite(&s,sizeof(struct S),1,pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
举例 fread:以二进制的方式读
struct S
{char arr[10];int num;float sc;
};
int main()
{struct S s = {0};//对格式化的数据进行写文件FILE* pf = fopen("test.dat","r");if(pf == NULL){perror("fopen");return 1;}//写文件fread(&s,sizeof(struct S),1,pf);//打印printf("%s %d %f",s.arr,s.num,s.sc);//关闭文件fclose(pf);pf = NULL;return 0;
}
int fseek ( FILE* stream,long int offset, ,int origin );
举例:
int main()
{FILE* pf = fopen("test.dat","r");if(pf == NULL){perror("fopen");return 1;}//读取文件int ch = fgetc(pf);printf("%c\n",ch);//调整文件指针fseek(pf,2,SEEK_CUR);ch = fgetc(pf);printf("%c\n",ch);return 0;
}
举例:
int main()
{FILE* pf = fopen("test.dat","r");if(pf == NULL){perror("fopen");return 1;}//调整文件指针fseek(pf,2,SEEK_CUR);//查看现在指针的便宜量输出为:2int n = ftell(pf);printf("%d\n",n);return 0;
}
举例:
int main()
{FILE* pf = fopen("test.dat","r");if(pf == NULL){perror("fopen");return 1;}//调整文件指针fseek(pf,2,SEEK_CUR);//查看现在指针的便宜量输出为:2int n = ftell(pf);printf("%d\n",n);rewind(pf);//恢复指针到起始位置n = ftell(pf);printf("%d\n",n);return 0;
}
一个数据在内存中是怎么存储的呢?
测试代码:
int main()
{int a = 10000;FILE* fp = fopen("test.dat","r");if(fp == NULL){perror("fopen");return 1;}//写入fwrite(&a,sizeof(int),1,fp);//关闭fclose(fp);fp = NULL;return 0;
}
牢记: 在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
1.文本文件读取是否结束,判断返回值是否为EOF(fgetc)或者NULL(fgets)。
例如:
fgetc判断是否为 EOF,正常读取的时候,返回的是读取到的字符的ASCII码值。
fgets判断返回值是否为NULL,正常读取的时候,返回存放字符串的空间起始地址。
2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
举例:写代码把test.txt文件拷贝一份,生成test2.txt
int main()
{FILE* pfread = fopen("test.dat","r");if(pfread == NULL){return 1;}FILE * pfwrite = fopen("test2.txt","w");if(pfwrite == NULL){fclose(pfread);pfread = NULL;return 1;}//文件打开成功//读写文件int ch = 0;while((ch = fgetc(pfread) != EOF)){//写文件fputc(ch,pfwrite);}if(feof(pfread)){printf("遇到文件结束标准,文件正常结束\n");}else if(ferror(pfread)){printf("文件读取失败结束\n");}//关闭文件fclose(pfread);pfread = NULL;fclose(pfwrite);pfwrite = NULL;return 0;
}
C语言初识(1) | C简介 | 主函数 | 数据类型
C语言初识(2) | 变量和常量
C语言初识(3) | 字符串 | 转译字符
C语言初识(4) | 顺序 | 选择 | 循环
C语言初识(5) | 函数 | 数组 | 操作符
C语言初识(6) | 关键字
C语言初识(7) | 指针| 结构体 | define
C语言初阶(8) | 选择结构 | if_else | switch
C语言初阶(9) | while | break | continue | getchar
C语言初阶(10) | 初识for循环 | 入门