当前位置: 首页 > news >正文

Day 12

文件操作

    • 文件
    • 文件操作
    • 文件函数
    • 课堂笔记

文件

1)概述

FILE 所有平台的名字都一样,FILE 是一个结构体类型,里面的成员功能一样,不同平台成员的名字不一样。
FILE *fp
1、fp指针,只用调用了fopen().在堆区分配空间,把地址返回给fp
2、fp指针不是指向文件,fp指针和文件关联,fp内部成员保存了文件的状态
3、操作fp指针,不能直接操作,必须通过文件库函数来操作fp指针
4、通过库函数操作fp指针,对文件的任何操作,fp里面成员会相应的变化(系统自动完成)

2)文件分类

(1)磁盘文件
指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。

(2)设备文件
在操作系狁一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写

(3)从用户或者操作系统使用的角度(逻辑上)把文件分为:
1)文本文件:基于字符编码的文件
2)二进制文件:基于值编码的文件

3)文件操作流程

1、打开文件fopen()

2、读写文件
1)按字符读写fgetc(),fputc()
2)按字符串(行)读取文件fgets(),fputs()
3)文件结尾判断 feof()

3、关闭文件fclose()

文件操作

标准文件设备指针

#include<stdio.h>
int main()
{printf("aaaaaaa\n");//fclose(stdout); //关闭标输入文件指针printf("bbbbbbbbbbbbb\n");//打印库文件函数调用失败的原因perror("mike");fclose(stderr);perror("jiang");int a = 10;printf("请输入a:");fclose(stdin);scanf("%d",&a);printf("a = %d\n",a);return 0;
}

 标准设备补充

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{//printf函数的内部实现,往标准输出设备(1)写内容printf("before aaaaaaa\n");//fclose(stdout);close(1); //1代表就是标准输出设备,关闭了,1就是空闲的数字int fd = open("01.txt", O_WRONLY,0777);//printf函数的内部实现,往(1)写内容,但是1现在和01.txt关联。printf的内容写到01.txtprintf("fd = %d\n",fd);printf("after bbbbbbb\n"); printf("after ddddddd\n");printf("after ccccccccc\n");return 0;
}    

文件的打开和关闭

#include<stdio.h>
int main()
{FILE *fp = NULL;//打开成功,返回有效地址//打开失败,返回NULL//"w",如果文件不存在,新建,如果文件存在,清空内容再打开//"r",如果文件不存在,打开失败//"a"如果文件不存在,新建,如果文件存在,光标自动放在文件末尾fp = fopen("./02.txt","w");if(fp == NULL){perror("fopen");return 0;}fclose(fp);fp = NULL;return 0;
}

 文件路径说明

1、在Linux,相对路径相对于可执行程序2、VS
a.编译同时运行程序,相对路径,相对于xxxx.vcxproj(项目文件)所在的路径
b.如果直接运行程序,相对路径相对于可执行程序3、Qt
a.a.编译同时运行程序,相对路径,相对于debug所在的路径
b.如果直接运行程序,相对路径,相对于可执行程序fopen("1.txt,""w");char *p = "1.txt";
fopen(p,"w");char p[] = "1.txt";
fopen(p."w");char *mode = "w";
fopen("1.txt",mode);

文件函数

  • fputc的使用
    #include<stdio.h>
    int main()
    {//1、打开文件FILE *fp = NULL;fp = fopen("02.txt","w");if(fp == NULL){perror("fopen");return -1;}//2、写文件fputc().一次只能写一个字符char ch = 'a';while(ch <= 'z'){fputc(ch,fp);ch++;}char buf[] = "abcdef";int i = 0;int n = strlen(buf);for(i = 0;i < n;i++){fputc(buf[i],fp);}fputc(1,fp);fputc(2,fp);fputc(-1,fp);fputc(97,fp);//3、关闭文件fclose(fp);fp = NULL;return 0;
    }int main01()
    {//1、打开文件FILE *fp = NULL;fp = fopen("01.txt","w");if(fp == NULL){perror("fopen");return -1;}//2、写文件fputc().一次只能写一个字符fputc('a',fp);fputc('b',fp);fputc('c',fp);fputc('d',fp);fputc('a',stdout);fputc('b',stdout);fputc('c',stdout);fputc('d',stdout);//3、关闭文件fclose(fp);fp = NULL;return 0;
    }
    
  • fgetc的使用
    #include<stdio.h>
    #include<string.h>
    //1、如果是文本文件,可以通过-1(EOF)判断文件是否结尾
    void write_file()
    {//1、打开文件FILE *fp = fopen("03.txt","w");if(fp == NULL){perror("write_file fopen");return;}//2、写文件char *p = "abcdef";int i = 0;int n = strlen(p);for(i = 0;i < n;i++){fputc(p[i],fp);}//3、关闭文件fclose(fp);
    }
    void read_file()
    {//1、打开文件,以读的方式打开FILE *fp = fopen("03.txt","r");if(fp == NULL){perror("read_file fopen");return;}//2、读文件,每次读一个字符char ch;ch = fgetc(fp);printf("ch = %c\n",ch);ch = fgetc(fp);printf("ch = %c\n",ch);ch = fgetc(fp);printf("ch = %c\n",ch);//3、关闭文件fclose(fp);}
    int main()
    {write_file();read_file();return 0;
    }
    
  • fgetc的补充1使用
    #include<stdio.h>
    #include<string.h>
    //1、如果是文本文件,可以通过-1(EOF)判断文件是否结尾
    void write_file()
    {//1、打开文件FILE *fp = fopen("04.txt","w");if(fp == NULL){perror("write_file fopen");return;}//2、写文件char *p = "abcdef";int i = 0;int n = strlen(p);for(i = 0;i < n;i++){fputc(p[i],fp);}//3、关闭文件fclose(fp);
    }
    void read_file()
    {//1、打开文件,以读的方式打开FILE *fp = fopen("04.txt","r");if(fp == NULL){perror("read_file fopen");return;}//2、读文件,每次读一个字符char ch;while(1){ch = fgetc(fp);printf("ch = %c\n",ch);//if(ch == -1)  //1if(ch == EOF){break;}}//3、关闭文件fclose(fp);}
    int main()
    {write_file();read_file();return 0;
    }
    
  • fgetc的补充2使用
    #include<stdio.h>
    #include<string.h>
    //1、如果是文本文件,可以通过-1(EOF)判断文件是否结尾
    void write_file()
    {//1、打开文件FILE *fp = fopen("05.txt","w");if(fp == NULL){perror("write_file fopen");return;}//2、写文件fputc('a',fp);fputc('b',fp);fputc(-1,fp);fputc('d',fp);fputc(-1,fp);fputc('e',fp);//3、关闭文件fclose(fp);
    }
    void read_file()
    {//1、打开文件,以读的方式打开FILE *fp = fopen("05.txt","r");if(fp == NULL){perror("read_file fopen");return;}//2、读文件,每次读一个字符char ch;while(1){ch = fgetc(fp);printf("ch = %d\n",ch);if(feof(fp))//如果文件结尾,返回真{break;}}//3、关闭文件fclose(fp);}
    int main()
    {write_file();read_file();return 0;
    }
    
  • feof的使用
    #include<stdio.h>
    int main()
    {//1、打开文件FILE *fp = fopen("06.txt","r");//2、写文件while(1){printf("文件没有结尾\n");int ch = fgetc(fp); //读取,目的是为了判断是否结尾printf("ch = %d\n",ch);if(feof(fp)) //如果到文件结尾,跳出循环{break;}}//3、关闭文件fclose(fp);return 0;
    }
    
  • cat命令的实现
    #include<stdio.h>
    int main(int argc, char *argv[])
    {//1、打开文件,文件路径,argv[1],读方式FILE *fp = fopen(argv[1],"r");//2、读取文件内容,将文件内容显示到屏幕上char ch;while(1){ch = fgetc(fp);if(feof(fp)) //如果文件结尾,退出循环{break;}printf("%c",ch);}//3、关闭文件fclose(fp);return 0;
    }
    
  • vi命令的实现
    #include<stdio.h>
    #include<string.h>
    //scanf()不能空格
    //gets()不能有回车
    int main(int argc, char *argv[])
    {//以写方式打开文件,w,路径为argv[1]FILE *fp = fopen(argv[1],"w");//从键盘读取内容fgets(),放在字符数组//字符数组内容,一个一个字符往文件写char buf[1024];while(1){fgets(buf,sizeof(buf),stdin);//如果用户输入的内容为:wq,结束,保存文件if(strncmp(buf,":wq",3)==0){break;}int i = 0;/*while(buf[i] != '\0') //读取的内容没有到结束符,读取到的内容写入文件{fputc(buf[i],fp);i++;}*/int n = strlen(buf);for(i = 0;i < n;i++){fputc(buf[i],fp);}}//关闭文件fclose(fp);return 0;
    }
    
  • fputs的使用
    #include<stdio.h>
    int main()
    {//打开文件FILE *fp = fopen("09.txt","w");/*//写文件char *p1 = "hello\n";fputs(p1,fp);char *p2 = "sdaf\n";fputs(p2,fp);char *p3 = "mike\n";fputs(p3,fp);*///指针数组,它是数组,每个元素都是指针char *p[] = {"hello\n","abc\n","mike\n"};int i = 0;int n = sizeof(p)/sizeof(p[0]);for(i = 0;i < n;i++){fputs(p[i],fp);}return 0;
    }
    int main01()
    {char buf[] = "hello";//把buf的内容写到stdout所代表的文件,显示屏幕fputs(buf,stdout);char *p = "mike";fputs(p,stdout);return 0;
    }
    
  • fgets的使用
     
    #include<stdio.h>
    int main()
    {//打开文件FILE *fp = fopen("10.txt","r");//读文件char buf[100];//1、从fp所关联的文件读取内容,放到buf,一次最大读取为sizeof(buf)-1//2、遇到换行符,文件结尾,出错,结束本次读取while(1){fgets(buf,sizeof(buf),fp);printf("buf = %s",buf);if(feof(fp))//如果到文件结尾,跳出循环{break;}}//关闭文件fclose(fp);return 0;
    }
    

课堂笔记

1、如果是文本文件,可以通过-1(E0F)判断文件是否结尾
2、如果是二进制文件,不能以-1判断文件结尾
3、feof()判断文件是否结尾,任何文件都能判断feof(fp);//如果到文件结尾,返回真
1、如果第一次没有对文件进行读操作,直接调用此函数,永远返回假(文件没有到结尾)
2、此函数必须,先读,再调用feof()才有意义
3、调用此函数,光标不会自动往后移动
4、必须读取后,才能判断是否结束,判断的是读取的字符

相关文章:

  • 【Vue】单元测试(Jest/Vue Test Utils)
  • React自定义Hook之useMutilpleRef
  • React19源码系列之 root.render过程
  • Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)
  • 14、服务端组件:未来魔法预览——React 19 RSC实践
  • 权力结构下的人才价值重构:从 “工具论” 到 “存在论” 的转变​
  • 详解React Fiber架构中,reconcile阶段的具体工作流程
  • 【项目篇之消息序列化】仿照RabbitMQ模拟实现消息队列
  • PostgreSQL psql 命令和常用的 SQL 语句整理
  • WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换Java代码
  • 哈希封装unordered_map和unordered_set的模拟实现
  • 海思dump图原理
  • socket套接字-UDP(中)
  • java Optional
  • 【MQ篇】RabbitMQ之死信交换机!
  • OpenCV 图形API(65)图像结构分析和形状描述符------拟合二维点集的直线函数 fitLine2D()
  • FlinkUpsertKafka深度解析
  • 基础的贝叶斯神经网络(BNN)回归
  • 零基础小白如何上岸数模国奖
  • 大学之大:伦敦政治经济学院2025.4.27
  • 经济日报:多平台告别“仅退款”,规则调整有何影响
  • 新干式二尖瓣瓣膜国内上市,专家:重视瓣膜病全生命周期管理
  • 图像编辑新增一款开源模型,阶跃星辰发布Step1X-Edit
  • 伊朗港口爆炸事件已致195人受伤
  • 日均新开三家“首店”,上海的“首发经济”密码是什么?
  • 当哲学与戏剧作为一种生活方式——《人生六戏》分享会