2024年C语言文件操作0基础保姆级教程_charch,30岁转行程序员

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}

//fgetc 读取一个字符,读取一个后文件指针往后偏移一位
int main()
{
FILE*pr = fopen(“test.txt”,“r”);
if (pr == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
char ch = 0;//用ch接收输入的字符
ch = fgetc(pr);//从文件"test.txt"中读取,读取一个字符后文件指针自动往后移一位
fclose(pr);
pr = NULL;
printf(“%c”,ch);
return 0;
}


 4.对所有流的理解



> 
> 什么是流:流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存                        向外部输出设备(显示器)输出的过程。                       
> 
> 
> 


上述代码演示的是对**文件流**的操作,我们在用**标准输入(stdin)输出(stdout)流**演示一下


![](https://img-blog.csdnimg.cn/20211007144445976.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)


### ③fputs与fgets


1.fputs——输出函数


![](https://img-blog.csdnimg.cn/20211007144533220.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>将字符串写入流中
> 
> 
> <返回值>int——非负值表示成功
> 
> 
>                EOF——发生错误
> 
> 
> <适用>所有流
> 
> 
> 


2.fgets——输入函数


![](https://img-blog.csdnimg.cn/20211007144804334.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>从流中获取字符串
> 
> 
> <返回值>正常——返回字符串
> 
> 
>                NULL——表示错误或者到达文件结尾
> 
> 
> <参数>n-从流中读取的最大字符数(\0会自动占去一位)
> 
> 
> 


3.使用示范



#include <stdio.h>
#include <string.h>
#include<errno.h>
//fputs
int main()
{
FILE*pw = fopen(“test.txt”,“w”);
if (pw == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
char ch[5] = “abcd”;
fputs(ch,pw);
fclose(pw);
pw = NULL;
return 0;
}

//fgets
int main()
{
FILE*pr = fopen(“test.txt”,“r”);
if (pr == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
char ch[5] = {0};
fgets(ch,3,pr);//有一位自动被\0占用
printf(“%s”,ch);
return 0;
}


### ④fprintf与fscanf


1.fprintf——输出函数


![](https://img-blog.csdnimg.cn/20211007145149523.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)


![](https://img-blog.csdnimg.cn/20211007145309152.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>将特定格式的数据写入流中
> 
> 
> <返回值>返回打印的字节数。
> 
> 
> <适用>所有流
> 
> 
> <对比>printf默认将数据打印在标准输出流(stdout)上,而fprintf的输出流可以选择。printf             打印的字符数返回
> 
> 
> 


 2.fscanf——输入函数


![](https://img-blog.csdnimg.cn/20211007145500557.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)


![](https://img-blog.csdnimg.cn/20211007145516582.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>从流中读取特定格式的数据
> 
> 
> <适用>所有流
> 
> 
> <返回值>返回成功转换和分配的字段数量
> 
> 
> 


3.使用示范



//头文件同上略
//fprintf
int main()
{
FILE*pw = fopen(“test.txt”,“w”);
if (pw == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
fprintf(pw,“%d %.2f %c”,10,3.14,‘a’);
fclose(pw);
pw = NULL;
return 0;
}

//fscanf
int main()
{
int a; float b; char c;
FILE*pr = fopen(“test.txt”,“r”);
if (pr == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
fscanf(pr,“%d %f %c”,&a,&b,&c);
printf(“%d %.2f %c”, a,b,c);
return 0;
}


### ⑤fwrite与fread


1.fwrite——输出函数


![](https://img-blog.csdnimg.cn/20211007150257933.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>将数据以二进制的形式写入文件流中
> 
> 
> <参数>buffer-指向写入数据的指针    size-每一个元素的大小   count-写入的最大元素数
> 
> 
> <返回值>实际写入的元素数
> 
> 
> <适用>文件流
> 
> 
> 


2.fread——输入函数


![](https://img-blog.csdnimg.cn/20211007150743358.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>将数据以二进制的形式从文件流中读取
> 
> 
> <返回值>实际读入的元素数
> 
> 
> <适用>文件流
> 
> 
> 


 3.使用示范



//头文件同上略
//fwrite fread
typedef struct stu
{
int n;
float score;
char name[10];
}stu;

int main()
{
stu s = {10,100.0,“张三”};
FILE*pr = fopen(“test.txt”,“rb”);
struct stu s1 = { 0 };
if (pr == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
//fwrite(&s,sizeof(stu),1,pw);
fread(&s1,sizeof(stu),1,pr);
fclose(pr);
pr = NULL;
return 0;
}


### ⑥fseek与ftell与rewind


1.fseek


![](https://img-blog.csdnimg.cn/20211007152835267.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>将文件指针移到指定的位置
> 
> 
> <参数>offset-偏移量        origin-初始化文件指针位置
> 
> 
>             origin有三种选择:**SEEK\_CUR** 从当前位置开始
> 
> 
>                                            **SEEK\_END** 从文件结尾开始
> 
> 
>                                            **SEEK\_SET**从文件开头开始
> 
> 
> <返回值>成功返回0,失败返回非0值
> 
> 
> <注意>对文件指针的修改不可以通过p++的方式实先
> 
> 
> 


 使用演示(现已知记事本储存数据为“abcdef”)



//fseek
int main()
{
FILE*pr = fopen(“test.txt”,“r”);
int a = 0;
if (pr == NULL)
{
printf(“%s”,strerror(errno));
return 0;
}
//定位文件指针
fseek(pr, -1, SEEK_END);//指向最后一个的后一个
a=fgetc(pr);
b=ftell(pr);//返回当前指针位置
printf(“%c”,a);
printf(“%d”,b);
fclose(pr);
pr = NULL;
return 0;
}


(若初始化文件指针为SEEK\_SET,偏移1则得到b)


2.ftell


![](https://img-blog.csdnimg.cn/20211007163240977.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>返回当前文件指针的偏移量 
> 
> 
> 


3.rewind


![](https://img-blog.csdnimg.cn/20211007164206351.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>使文件指针回到文件的开始
> 
> 
> 


使用演示



int main()
{
int n;
FILE * pFile;
char buffer[27];
pFile = fopen(“test.txt”, “w+”);
for (n = ‘A’; n <= ‘Z’; n++)
fputc(n, pFile);
rewind(pFile);
fread(buffer, 1, 26, pFile);
fclose(pFile);
buffer[26] = ‘\0’;
puts(buffer);
return 0;
}


### ⑦ferror与feof


1.ferror


![](https://img-blog.csdnimg.cn/20211007183909603.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>检查流是否发生了错误
> 
> 
> <返回值>若发生错误则返回0,否则返回非0值
> 
> 
> 


2.feof


![](https://img-blog.csdnimg.cn/20211007184143811.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  



> 
> <功能>当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
> 
> 
> <返回值>若不是文件末尾则返回0,是文件末尾则返回非0值
> 
> 
> <注意>在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。  
>  而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
> 
> 
> 



> 
> 1. 文本文件读取**是否结束**,判断返回值是否为EOF (fgetc),或者NULL(fgets)  
>  例如:  
>  fgetc判断是否为EOF.  
>  fgets判断返回值是否为NULL.  
>  2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。  
>  例如:  
>  fread判断返回值是否小于**实际要读的个数**
> 
> 
> 


使用演示(对于文本文件)



int main(void)
{
int c; // 注意:int,非char,要求处理EOF,EOF本质上是-1
FILE* fp = fopen(“test.txt”, “r”);
if (!fp)
{
perror(“File opening failed”);
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
{
putchar©;
}
//判断是什么原因结束的
if (ferror(fp))
puts(“I/O error when reading”);
else if (feof(fp))
puts(“End of file reached successfully”);
fclose(fp);
}


 使用演示(对于二进制文件)



enum { SIZE = 5 };
int main(void)
{
double a[SIZE] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
double b = 0.0;
size_t ret_code = 0;
FILE *fp = fopen(“test.bin”, “wb”); // 必须用二进制模式
fwrite(a, sizeof(a), SIZE, fp); // 写 double 的数组 sizeof()表示这种类型大小
fclose(fp);
fp = fopen(“test.bin”, “rb”);
// 读 double 的数组
while ((ret_code = fread(&b, sizeof(double), 1, fp)) >= 1)
{
printf(“%lf\n”, b);
}
if (feof(fp))
printf(“Error reading test.bin: unexpected end of file\n”);
else if (ferror(fp)) {
perror(“Error reading test.bin”);
}
fclose(fp);
fp = NULL;
}


### ⑧补充函数 sscanf sprintf


1.sprintf


![](https://img-blog.csdnimg.cn/20211007191413166.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>将特定格式的数据写入字符串
> 
> 
> <参数>buffer-输出的储存位置 
> 
> 
> <返回值>写入字符串的数据大小(单位字节)
> 
> 
> 


2.sscanf


![](https://img-blog.csdnimg.cn/2021100719172136.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



> 
> <功能>从字符串中读取特定格式的字符串
> 
> 
> 


3.使用演示



//sprintf sscanf
typedef struct stu
{
int n;
float score;
char name[10];
}stu;

int main()
{
stu s = {10,3.14,“张三”};
char buf1[1024] = {0};
stu s1 = {0};
sprintf(buf1, “%d %f %s”,s.n,s.score,s.name);//不要再加上n=…,score=…
sscanf(buf1,“%d %f %s”,&(s1.n),&(s1.score),&(s1.name));
printf(“%d\n”,s1.n);
printf(“%s\n”,s1.name);
return 0 ;
}


### ⑨补充函数perror  strerror


![](https://img-blog.csdnimg.cn/20211007192028204.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA572F6ZqZLQ==,size_20,color_FFFFFF,t_70,g_se,x_16)




![img](https://img-blog.csdnimg.cn/img_convert/4327367548a7a0c67af7500ec57cf182.png)
![img](https://img-blog.csdnimg.cn/img_convert/546bfef2edd856bcd5384906ca8f1d80.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

),&(s1.name));
	printf("%d\n",s1.n);
	printf("%s\n",s1.name);
	return 0 ;
}

⑨补充函数perror  strerror

[外链图片转存中…(img-4TPFUucU-1715571067471)]
[外链图片转存中…(img-UgdqbGIj-1715571067471)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值