第十二章 文件
第二节 文件的开,关,读,写实战操练
1. 文件的打开
-
文件在读或写之前必须要打开,在读或写之后必须要关闭
-
fopen:文件打开函数,fopen函数的调用方式
FILE *fp; // FILE是个结构,fp是指向结构FILE的指针变量
fp = fopen(文件名, 使用的文件的方式) //文件名和使用文件的方式都是字符串“”
fp = fopen("a.txt", "r"); //打开a.txt文件, 使用的打开方式为只读
// fp现在就指向了打开的a.txt文件
// sizeof(FILE)
if(fp == NULL){
文件打开失败
}
- 通过fopen语句告诉系统三个信息
-
需要打开的文件名
-
使用文件的方式
-
让哪个指针变量指向被打开的文件,这里是fp这个指针变量
- 文件有个位置指针fgetc
2. 文件的关闭
-
只有fopen成功的文件才需要关闭
-
关闭文件的原因
-
释放该文件占用的内存单元, 要养成资源用完要及时释放的好习惯
-
防止往文件中写内容时,文件内容写入不全(如果缓冲区没满,没有写入到磁盘,如果程序关闭,会导致文件内容写入不全),
关闭文件的动作会触发系统把缓冲区的数据立即写入到磁盘上
- fclose:文件关闭函数,fclose函数的调用方式:
// fclose(文件指针)
if (fp != NULL){
fclose(fp); // fp就是fopen()的返回值
}
3. 文件的读写简单讲
- fputc和fgetc函数
- fputc():该函数把一个字符写到磁盘文件上去,一般形式为
fputc(ch, fp); //ch就是这个字符,如果fputc失败,会返回EOF,如果成功,返回值就是写入文件的那个字符的ascii码值
- EOF (End of file) // #define EOF (-1)
#include <iostream>
#include <cstring>
int main(int argc, char *argv[]) {
FILE *fp;
fp = fopen("test.txt", "w");//打开只写文件,如果文件存在,文件内容清空,如果文件不存在,则创建文件
if (fp == NULL) {
printf("文件打开失败!\n");
} else {
// 文件打开成功
char reco = fputc('a', fp);
if (reco == EOF) {
//写入失败
} else {
char reco = fputc('b', fp);
}
}
if (fp != NULL) {
fclose(fp); // fp就是fopen()的返回值
}
return 0;
}
- fgetc: 从指定文件读入一个字符
- 调用形式: char reco = fgetc(fp)
- 如果执行成功,返回读入的字符,如果读入失败,或者整个文件读到末尾,返回EOF
#include <iostream>
#include <cstring>
int main(int argc, char *argv[]) {
FILE *fp;
// 文件刚打开,文件位置位于当前文件的头部
// 以文本方式打开数据
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
} else {
// 文件打开成功
// 读出一个字符,每读出一个字符,指针向下移一个字符
char reco = fgetc(fp);
// 判断文件是否读入结束
while (reco != EOF) {
putchar(reco);
reco = fgetc(fp);
}
}
if (fp != NULL) {
fclose(fp); // fp就是fopen()的返回值
}
return 0;
}
- feof(fp); //文件是否结束,如果文件结束,feof(fp)返回真(1), 如果文件没有结束,feof(fp)返回假(0)
4. 文件读写实战操练
- 商业代码,需要非常严谨
#include <iostream>
#include <cstring>
int main(int argc, char *argv[]) {
FILE *fp = fopen("test.txt", "r");
// if(fp ==NULL)
if (!fp) {
printf("文件打开失败!\n");
} else {
// 文件打开成功
char LineBuff[1024];//足以容纳一行的内容
while (!feof(fp)) {
LineBuff[0] = 0; // '\0'
// 每次读取一行
if (fgets(LineBuff, sizeof(LineBuff) - 1, fp) == NULL) {
continue;
}
if (LineBuff[0] == '\0') {
continue;
}
lblprocstring:
// 读到了实际内容
if (strlen(LineBuff) > 0) {
// 如果末尾是换行符或者回车符
if (LineBuff[strlen(LineBuff) - 1] == 10 || LineBuff[strlen(LineBuff) - 1] == 13) {
LineBuff[strlen(LineBuff) - 1] = '\0';
goto lblprocstring;
}
}
if (strlen(LineBuff) <= 0) {
continue;
}
printf("%s\n", LineBuff);
}
}
if (fp != NULL) {
fclose(fp); // fp就是fopen()的返回值
}
return 0;
}