🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🐰文件操作
🌸 fwrite
🌸fread
🌸fseek
🌸fteel
🌸rwind
🌸文本文件和二进制文件
🌸文件结束的判定
🌸文件缓冲区
🌸 实现拷贝一个文件
🐰文件操作
🌸 fwrite
fwrite向文件写入二进制数据
fwrite的原型:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
const void * ptr:指向要写出数据的内存首地址
size_t size:要写出数据的基本单元的字节大小
size_t count:要写数据基本单元的个数
FILE * stream:与文件相关联的文件指针
例如:
#include<stdio.h> #include<stdlib.h> typedef struct S { char name[20]; int age; float score; }S; int main() { S s1={"zhangsan",23,99.2}; FILE*pf=fopen("test.txt","wb");//wb是以二进制形式写入 if(pf==NULL) { perror("fopen"); return 1; } //写文件 fwrite(&s1,sizeof(s1),1,pf); //关闭文件 fclose(pf); pf=NULL; return 0; }
🌸fread
fread用于向文件中读取二进制数据
fread的原型:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
void * ptr:指向要写入数据的内存首地址
size_t size:要写入数据的基本单元的字节大小
size_t count:要写数据基本单元的个数
FILE * stream:与文件相关联的指针
例如:
#include<stdio.h> #include<stdlib.h> typedef struct S { char name[20]; int age; float score; }S; int main() { S s1={0}; FILE*pf=fopen("test.txt","rb");//以二进制数据读出 if(pf==NULL) { perror("fopen"); return 1; } //读文件 fread(&s1,sizeof(s1),1,pf); printf("%s %d %f",s1.name,s1.age,s1.score); printf("\n"); //关闭文件 fclose(pf); pf=NULL; return 0; }
🌸fseek
fseek用于改变文件指针指向的位置
fseek的原型:
int fseek ( FILE * stream, long int offset, int origin );
FILE * stream:与文件相关联的文件
long int offset:偏移量
int origin:起始位置
起始位置有三种选择:
SEEK_SET:文件开头
SEEK_CUR:文件的当前位置
SEEK_END;文件的末尾
🌸fteel
fteel计算文件指针指向的位置与文件开始的位置的偏移量
fteel的原型:
long int ftell ( FILE * stream );
FILE * stream :与文件相关联的指针
🌸rwind
rewind使文件指针回到文件的开始
rwind的原型:
void rewind ( FILE * stream );
FILE * stream :与文件相关联的指针
例如:
#include<stdio.h> #include<stdlib.h> int main() { //文件里保存的是:abcdefg //文件末尾应该'\0' FILE* pf=fopen("test_1.txt","r"); if(pf==NULL) { perror("fopen"); return 1; } //读文件 int ch=fgetc(pf);//ch=a pf指向b printf("%c\n",ch); ch=fgetc(pf);//ch=b pf指向c printf("%c\n",ch); ch=fgetc(pf);//ch=c pf指向d printf("%c\n",ch); fseek(pf,-3,SEEK_CUR);//从当前位置,向左偏移3位置 ch=fgetc(pf);//ch=a pf指向b printf("%c\n",ch); fseek(pf,3,SEEK_SET);//从开始位置,向右偏移3位置 ch=fgetc(pf);//ch=d pf指向e printf("%c\n",ch); fseek(pf,-3,SEEK_END);//从末尾位置,向左偏移3位置 ch=fgetc(pf);//ch=e pf指向f printf("%c\n",ch); printf("%ld\n",ftell(pf));//计算文件指针指向的位置与文件开始的位置的偏移量,这里是5 rewind(pf);//文件指针指向文件开始位置 ch=fgetc(pf);//ch=a pf指向b printf("%c\n",ch); return 0; } 结果: a b c a d e 5 a
🌸文本文件和二进制文件
文本文件:如果要求在外存上以ASCII码形式存储,以ASCII字符的形式存储的文件就是文本文件(我们能够读懂)
二进制文件:数据在内存以二进制的形式存储,如果不转换输出到外存中,就是二进制文件(二进制信息,我们还看不懂)
一个数据在内存是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据即可以用ASCII形式存储,也可以使用二进制形式存储
例如:
如果整数10000,如果以ASCII码的形式输出到磁盘,则磁盘占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节
例如:
#include<stdio.h> int main() { FILE* pf=fopen("test_1.txt", "wb"); if(pf==NULL) { perror("fopen"); return 1; } //写文件 int ch=10000; fwrite(&ch, sizeof(ch), 1, pf); fclose(pf); pf=NULL; return 0; }
🌸文件结束的判定
feof的作用是:当文件读取结束的时候,判断是文件结束的原因是否是遇到文件尾结束
(1)文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
(2)二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数
fgetc函数返回值的分析:读取失败返回EOF
1.遇到文件末尾,返回EOF,同时设置一个状态,遇到文件末尾了,用feof来检测这个状态
2.遇到错误,返回EOF,同时设置一个状态,遇到错误,用ferror来检测这个状态。
feof的原型:
int feof ( FILE * stream );
FILE * stream:与文件相关的指针
返回类型为整形:如果是文件正常结束,则返回非0数,否则,返回0
例如:
#include<stdio.h> #include<stdlib.h> int main() { //test.txt里面是:abcdefg FILE* pf=fopen("test.txt", "r"); if(pf==NULL) { perror("fopen"); return 1; } //读文件 int ch=0; while(ch=fgetc(pf)!=EOF) { printf("%d\n",ch); } printf("%d\n",feof(pf)); ferror(pf); return 0; } 结果: 1 1 1 1 1 1 1 1
🌸文件缓冲区
ANSIC标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲区文件系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。缓冲区的大小根据C编译系统决定的。
证明缓冲区的存在:
#include<stdio.h> #include <unistd.h> int main() { FILE* pf=fopen("test_2","w"); printf("休息10秒\n"); sleep(10); fputs("abcdefg",pf); fclose(pf);//关闭文件,会刷新缓冲区 pf=NULL; return 0; }
🌸 实现拷贝一个文件
#include<stdio.h> int main() { FILE*pf=fopen("test.txt", "r"); if(pf==NULL) { perror("fopen"); return 1; } //拷贝文件 FILE*pc=fopen("test_1.txt", "w"); if(pc==NULL) { fclose(pf); pf=NULL; perror("fopen"); return 1; } //拷贝 int ch; while((ch=fgetc(pf))!=EOF) { fputc(ch, pc); } fclose(pf); fclose(pc); pf=NULL; pc=NULL; return 0; }
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 文章来源:https://www.toymoban.com/news/detail-440898.html
文章来源地址https://www.toymoban.com/news/detail-440898.html
到了这里,关于文件操作以及相关的函数fwrite,fread,fseek,ftell,rwind,feof的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!