C语言基础 (12) 文件的操作 FILE
- 课程回顾
结构体基本操作:
- 结构体类型的定义
// struct为关键字 Stu为自定义标识符
// struct Stu才是结构体类型
// 结构体成员不能在定义类型时赋值
struct Stu
{
int
age;
char
name[50];
int score;
} // 后面有分号
2。结构体的定义和初始化
// 结构体变量初始化和数组很类似,只有在定义时,才能初始化
// 定义结构体变量时,别忘了struct关键字
struct Stu obj = {18,”mike”,58}
3。结构体成员变量的使用
obj.age = 18;
(&obj)->age = 18;
2.结构体指针变量
1) 指针变量指向栈区
struct Stu *p = NULL;
struct Stu obj; //栈区结构体
p = &obj; //指向栈区
p ->age = 18;
(*p).age = 18;
2) 指针变量指向堆区
struct Stu *p = NULL;
// 指向堆区
p = (struct Stu *)malloc(sizeof(struct Stu));
p -> age = 18;
free(p);
p = NULL;
3const修饰的指针变量
//看const修饰是*还是变量
const struct Stu *p (代表指针所指向的内存不能变
struct Stu const *p;(代表指针不能变
3.结构体数组
stuct Stu obj[3] = {
{18,”lily”,03},
{18,”lily”,03},
{18,”lily”,03},
}
struct Stu obj2[3] = {18,”lily”,99,22,”lucy”,-80,33….} // 这样就比较不清晰了
struct Stu tmp[3]
int I = 0
for (I = 0;i<3;i++)
{
(tmp +i)->age = 18+I;
(*(tmp+i)).age = 18+I; // .的优先级高,所以要加括号
tmp[i].age = 18+I; //常用
}
4.结构体和函数
1) 同类型结构体变量赋值
struct Stu obj1 = {18,”lily”,99};
struct Stu obj2;
- obj2 = obj1;
2)函数值传递
a)
struct Stu p;
// 结构体变量本身传递(值传递),形参修改不会影响到实参
// 调用完毕fun()函数,p的成员还是没有赋值
fun(p)
void fun(struct stu p) //值传递,相当于拷贝了一份,所以并没有变
{
p.age = 18;
strcpy(p.name,”mike”);
p.score = 59;
}

3 函数地址传递
struct Stu p;
fun(&p);
void fun(struct Stu *p)
{
p->age = 18;
strcpy(p->name,”mike”);
p->score = 59;
}
5 结构体套一级指针
struct stu
{
int age;
char *name; // 一级指针
int score;
}; // 后面有分号
1) 栈区结构体
struct Stu s;
s.age =10;
s.name = (char *)malloc( strlen(“mike”) +1);
strcpy(s.name,”mike”);
s.score = 59;
free(s.name);
2堆区结构体
struct Stu *p; //结构体是指针,后面在堆区分配空间
p = (struct Stu *)malloc(sizeof(struct Stu))
p->name = (char *)malloc(strlen(“mike”)+1)
p->age = 18
strcpy(p->name,”mike”)
p->score = 59
free(p->name)
free(p)

枚举

typedef

#define INT int
宏定义是在预处理阶段,前面的替换后面的
typedef是在编译阶段,后面的替换前面的
2 作业讲解
3 文件概述

printf 把内存中的10先放到缓冲区,再放到屏幕
为什么不直接打印到屏幕,而放到缓冲区呢?
为了效率,就是缓存 (可能会拿很多次,
如果只拿一次,当然是直接给屏幕比较快,但是可能会拿很多次


FILE 所有平台的名字都一样,FILE是一个结构体类型,里面的成员功能一样,不同平台成员的名字不一样
FILE *fp
看一下stdio.h

为了兼容改成typedef 最后转成FILE
不同平台成员不一样
(vs2013 vs2015同一个平台不同编译器,里面成员都不一样
FILE所有平台的名字都一样,FILE是一个结构体类型,里面的成员功能一样,不同平台成员的名字不一样
FILE *fp
1、fp指针,只用调用了fopen(),在堆区分配空间,把地址返回给fp
2、fp指针不是指向文件,fp指针和文件关联,fp内部成员保存了文件的状态
char *p
*fp(不能这样写!!不是里面是文件,fp只是保存了文件的状态

fd 文件描述符
ulimit

1,2被占用了 从3开始


3、操作fp指针 不能直接操作,必须通过文件库函数来操作fp指针
4、通过库函数操作fp指针,对文件的任何操作,fp内部成员会有相应的变化(操作系统自动完成)
结论:文件的操作是需要操作系统层来支持的,通过文件库函数来操作,不是像普通指针一样,p,*p这样直接拿内容。
https://stackoverflow.com/questions/5130375/how-exactly-does-fopen-fclose-work
https://www.cnblogs.com/llguanli/p/6791507.html
4 文件分类

分为设备文件和磁盘文件
5 文件操作流程
1、 打开文件fopen()
2、 读写文件
a) 按字符读写fgetc(),fputc()
b) 按字符串(行)读取文件fgets(),fputs()
c) 文件结尾判断 feof() // end of file
3、 关闭文件flose()
6 标准文件设备指针
fp指向堆区一片空间,空间中的数据和硬盘种的关联了

文件指针
stdin,stdout,stderr



7 标准设备补充

8 文件的打开关闭

FILE *fp = NULL;
//1、windows路径写法 因为\是转义字符,所以需要\\
fl = fopen(“D:\\1.txt”,”w”); //windows
fp = fopen(“D:/1.txt”,”w”); //linux,windows
// 当前路径
fp = fopen(“a.txt”,”w”)
fp = fopen(“./a.txt,”w”)
//绝对路径
fp = fopen(“/home/edu/a.txt”,”w”);
fopen会在堆区分配空间,返回堆区地址给fp


9 文件路径说明
相对路径:
1、在linux,相对路径相对于可执行程序
2、VS
a,编译同时运行程序,相对路径是相对于.vcxproj(项目文件)所在的路径
b, 如果直接运行程序,相对路径线相对于可执行程序
3、Qt
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);

10 上午知识复习
1.文件的类型
文本文件和二进制文件
2.文件的打开关闭
1.文件指针
FILE *fp;
stdin //0 标准输入
stdout //1 标准输出
stderr //2 标准出错
2.文件的打开
fopen(‘路径’,’权限w/r/a’)
3.文件的关闭
11 fputc的使用
1 打开文件fopen()
2 读写文件
3 关闭文件f close


12 fputc的使用补充

13 fgetc的使用

1、如果是文本文件,可以通过-1(EOF) 判断文件是否结尾
(!ASCII码没有-1

#include <stdio.h>
#include <string.h>
void write_file()
{
//1、打开文件
FILE *fp = fopen("4.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("4.txt", "r");
if (fp == NULL)
{
perror("write_file fopen");
return;
}
//2、读文件,每次读一个字符
char ch;
// while (ch != -1) //EOF 文本文件结尾默认是-1
while (ch != EOF) // 有这个宏
{
ch = fgetc(fp);
// printf("ch = %c\n", ch); //以char形式打出
printf("ch = %d\n", ch); //以数字形式打出
}
//3、关闭文件
fclose(fp);
}
int main(int argc, char const *argv[])
{
write_file();
read_file();
return 0;
}
14 feof的存在意义
1、如果是文本文件,可以通过-1(EOF)判断文件是否结尾
2、如果是二进制文件,不能以-1判断文件结尾
3、feof()判断文件是否结尾,任何文件都能判断

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

(这个东西是判断光标以前的字符

16 feof的使用补充

17 cat命令的实现
将mycat放在cat所在路径


放到目录里 然后用mycat命令就可以了,C语言的cat命令就是这样实现的
18 课堂答疑
19 vi命令的实现
不能用scanf 因为不能有回车 空格
gets 不能有回车
所以只能用fgets (可以有空格,也可以有回车



// 读一点写一点
20 课堂答疑

注意 fgets会保存’\n’
21 fputs的使用

22 fgets的使用

读一下,发现后面全都是mike

因为读到文件结尾的时候会接触本次读取,所以buf内的内容并没有变,还是最后一行的内容,
用一下memset:

(边界值的问题,现在也顺便讲解了memset怎么用的
循环读取:

解决方法:

(放前面
23 作业
C语言基础 (12) 文件的操作 FILE的更多相关文章
- Go语言基础之文件操作
本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open()函数能够打开一个 ...
- GO学习-(16) Go语言基础之文件操作
Go语言文件操作 本文主要介绍了Go语言中文件读写的相关操作. 文件是什么? 计算机中的文件是存储在外部介质(通常是磁盘)上的数据集合,文件分为文本文件和二进制文件. 打开和关闭文件 os.Open( ...
- C/C++文件输入输出操作——FILE*、fstream、windowsAPI
基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio. ...
- C/C++文件输入输出操作——FILE*、fstream、windowsAPI(转载)
基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdi ...
- python 基础之文件读操作
创建一个名为‘尘曦’的文件内容如下 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. ...
- delphi 基础之三 文件流操作
文件流操作 Delphi操作流文件:什么是流?流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具.在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的, ...
- 文件及文件夹操作- File类、Directory 类、FileInfo 类、DirectoryInfo 类
文件及文件夹操作: C/S:WinForm可以操作客户端文件 Client ServerB/S:Brower Server 命名空间:using system .IO; 1. File类: 创建:Fi ...
- Python基础灬文件常用操作
文件常用操作 文件内建函数和方法 open() :打开文件 read():输入 readline():输入一行 seek():文件内移动 write():输出 close():关闭文件 写文件writ ...
- C语言基础(20)-文件操作(fopen,getc,fclose)
一.文件操作 读文件的顺序: 1.先打开文件 2.读写文件 3.关闭文件 1.1 fopen FILE *fopen( const char *path, const char *mode ); 函数 ...
随机推荐
- Spring事务的传播行为分析
前言 最近项目有涉及到Spring事务,所以工作之余,想认真了解学习下Spring事务,查阅了若干资料,做了一个demo(PS:参考了大牛的). 现分享总结如下: 1.Spring 事务的简介 理解事 ...
- OSX: 安装打印机的有用命令行
事实上非常easy.就是有用lpadmin命令,以下给出一个样例: printername="YOUR_PRINTER_NAME" location="LOCATION ...
- 4443: [Scoi2015]小秃玩矩阵|二分答案|匈牙利
第K大看成第K小各种WA. .. 第K大也就是第n−K+1小.所以就能够愉快的二分答案了 二分答案找出比当前答案小的数的位置的坐标.推断一下能否够选出满足不在同一行同一列的n−K+1个数,然后就能够愉 ...
- PAAS平台的web应用性能測试与分析
引言 为什么我会写这一篇博客,由于近期非常多京东云擎jae的用户反应一个问题就是他们部署在jae上面的应用訪问非常慢,有极少数应用甚至常常出现504超时现象.当然大家首先想到的是jae性能太差,这也是 ...
- 面向基于英特尔® 架构的 Android* 的 CoCos2D
Cocos2D 是一款游戏引擎,可与从电脑到手机等多种设备配合使用. 该引擎支持丰富的特性,可帮助创建出色的 2D 游戏.它甚至包含具备全面功能的物理引擎. CoCos2D 的核心元素是基本动画元素( ...
- WinForm使用CefSharp内嵌chrome浏览器
先贴运行图:亲测可用!以图为证! 开始!1.创建winform程序,使用.NET 4.5.2或以上(vs2010最高支持.NET 4.0,我使用的是vs2017).这一步容易忽略,简单的说就是将项目. ...
- C++设计模式之状态模式(二)
2.智能空调的设计与实现 某软件公司将开发一套智能空调系统: 系统检測到温度处于20---30度之间,则切换到常温状态:温度处于30---45度,则切换到制冷状态: 温度小于20度,则切换到制热状态. ...
- 寻找不到iframe元素
一直找不到元素,是因为有两层iframe的 找iFrame元素方法如下 1.iFrame有ID 或者 name的情况//进入id="frame1"的frame中,定位id=&quo ...
- 鸟哥的Linux私房菜笔记第六章(一)
目录与路径 相对路径与绝对路径 上一章简单的提到绝对路径和相对路径 绝对路径:路径的写法一定是由根目录(/)写起的,例如:/home/user 这个目录 相对路径:路径的写法不是由根目录(/)写起,例 ...
- Excel 查找某列中的数据在另一列是否存在并输出其他列的数据
最近在操作Excel文件数据导入数据库时,经常需要检查Excel中哪些数据数据库中已经存在,哪些不存在,然后再将不存在数据库中的Excel数据导入:在此过程中,经常需要操作Excel中的数据,所以.也 ...