目录
📢1.为什么使用文件
📢2.什么是文件
储存在磁盘中的文件就是文件
在程序设计中,根据文件的功能,常说的文件包括程序文件和数据文件
📢2.1 程序文件
📢2.2 数据文件
📢2.3 二者的关系
📢 2.4 文件名
📢3.文件的打开和关闭
📢3.1文件指针
📢3.2 文件的打开与关闭
fopen |
头文件 #include <stdio.h> |
格式 FILE *fopen(const char *filename,const char *mode) |
r 以只读模式打开一个已存在的文本文件,如果文件不存在,会出错。 w 以只写模式生成文本文件,若文件存在则文件长度清为Q②. a 以追加模式,也就是从文件末尾处开始的只写模式,打开或生成文本文件。 打开方式 rb 以只读模式打开二进制文件。 wb以只写模式生成二进制文件,若文件存在则文件长度清为0. ab 以追加模式,也就是从文件末尾处开始的只写模式,打开或生成二进制文件。 r+ 以更新(读写)模式打开文本文件。 w+以更新模式生成文本文件,若文件存在则文件长度清为0. a+以追加模式,也就是从文件末尾处开始写入的更新模式,打开或生成文本文件。 |
返回值 返回一个指向对象的指针,该对象用于控制已打开的流。若打开操作失败,则返回空指针 |
📢这里的“流”,是一个宏观概念,通过连接键盘,显示器等周边机器形成的 “字符流通的管道”
fclose |
头文件 #include <stdio.h> |
格式 int fclose(FILE *stream); |
功能 刷新stream指向的流,关闭与该流相连的文件。流中只进行了缓冲操作,还未被写入的数据 会被传递到主机环境,由主机环境把这些数据写入文件中,而缓冲区里面尚未被读取的数据 会被丢弃。然后把该流与文件分离,如果存在系统自动分配的与该流相连接的缓冲区,则会 释放该缓冲区。 |
返回值 成功关闭流时返回0,检测出错误时则返回EOF |
//以只读模式访问文件
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
int main()
{
//打开文件
FILE* fp = fopen("text.txt","r");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));//打印出错误原因
return 0;
}
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
不存在text文件时
📢 4.文件的顺序读写
📢只写模式
📢单个字符输出(fputc)
fputc |
头文件 #include <stdio.h> |
格式 int fputc(int C, FILE *stream); |
功能 将c指定的字符转换成unsigned char 型并写入 stream 指向的输出流 |
返回值 返回写入的字符,若发生写入错误,则对流设置错误指示符并返回 EOF |
//从内存中输出到文件流中
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
int main()
{
//打开文件
FILE* fp = fopen("text.txt","w");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//写文件,从内存中输出到文件中
int i = 0;
for (i = 'a'; i <= 'z'; i++)
{
fputc(i,fp);
}
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
程序运行后:
📢 整行的输出(fputs)
fputs |
头文件 #include <stdio.h> |
格式 int fputs(const char *s, FILE *stream); |
功能 把参数s指向的字符串写入stream指向的流,但不包括字符串末尾的空字符 |
返回值 若发生写入错误则返回EOF,否则返回非负值 |
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
int main()
{
//打开文件
FILE* fp = fopen("text.txt","w");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
fputs("abcdef",fp );
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
📢只读模式
📢单个字符的输入 (fgetc)
fgetc |
头文件 #include <stdio.h> |
格式 int fgetc(FILE *stream); |
功能 从stream指向的输入流中读取 unsigned char 型的下一个字符的值 |
返回值 返回EOF.发生读取错误时,则对该流设置错误指示符并返回 EOF |
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
int main()
{
//打开文件
FILE* fp = fopen("text.txt", "r");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//读文件
int ch;
while ((ch=fgetc(fp))!=EOF)
{
printf("%c ", ch);
}
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
📢整行的输入(fgets)
fgets |
头文件 #include <stdio.h> |
格式 char * fgets(char * s, int n,FILE *stream); |
功能 从stream指向的输入流中读取 unsigned char 型的字符串 |
返回值 函数获取字符串放入数组a,返回该数组的指针(首地址)如果读完,则返回空指针NULL |
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
int main()
{
//打开文件
FILE* fp = fopen("text.txt", "r");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//读文件
char ch[3];
fgets(ch,3,fp);
printf("%s", ch);
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
📢这里的fgets的第二个参数就是决定读取多少个字符,读取的字符数就是对应的数字减一;
📢拷贝文件
#include<stdio.h>
#include<errno.h>
int main()//拷贝文件
{
FILE* pr = fopen("text.txt", "r");
if (pr == NULL)
{
printf("open for read:%s\n", strerror(errno));
return 0;
}
FILE* pw = fopen("text2.txt","w");
if (pr == NULL)
{
printf("open for write:%s\n", strerror(errno));
close(pr);
pr = NULL;
return 0;
}
int ch=0;
//拷贝文件
while ((ch=fgetc(pr)) != EOF)
{
fputc(ch, pw);
}
//关闭文件
fclose(pr);
pr == NULL;
fclose(pw);
pw == NULL;
return 0;
}
📢此时拷贝的text2与text完全相同
欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁