导图社区 文件操作
文件操作、在while里面放入fgets()函数进行判断,而不是判断fp是否=NULL……、读取到字符之后,就可以用printf()输出了。
编辑于2022-11-10 10:18:29时间管理-读书笔记,通过学习和应用这些方法,读者可以更加高效地利用时间,重新掌控时间和工作量,实现更高效的工作和生活。
本书是法兰教授的最新作品之一,主要阐明了设计史的来源、设计史现在的状况以及设计史的未来发展可能等三个基本问题。通过对设计史学科理论与方法的讨论,本书旨在促进读者对什么是设计史以及如何写作一部好的设计史等问题的深入认识与反思。
《计算机组成原理》涵盖了计算机系统的基本组成、数据的表示与运算、存储系统、指令系统、中央处理器(CPU)、输入输出(I/O)系统以及外部设备等关键内容。通过这门课程的学习,学生可以深入了解计算机硬件系统的各个组成部分及其相互之间的连接方式,掌握计算机的基本工作原理。
社区模板帮助中心,点此进入>>
时间管理-读书笔记,通过学习和应用这些方法,读者可以更加高效地利用时间,重新掌控时间和工作量,实现更高效的工作和生活。
本书是法兰教授的最新作品之一,主要阐明了设计史的来源、设计史现在的状况以及设计史的未来发展可能等三个基本问题。通过对设计史学科理论与方法的讨论,本书旨在促进读者对什么是设计史以及如何写作一部好的设计史等问题的深入认识与反思。
《计算机组成原理》涵盖了计算机系统的基本组成、数据的表示与运算、存储系统、指令系统、中央处理器(CPU)、输入输出(I/O)系统以及外部设备等关键内容。通过这门课程的学习,学生可以深入了解计算机硬件系统的各个组成部分及其相互之间的连接方式,掌握计算机的基本工作原理。
文件操作
12.11 获取文件大小
使用函数
fpos_t()
fpos_t fpos1;
文件的内部指针类型
fgetpos()
fgetpos(FILE *fp, fpos_t file_point_position_name);
获取文件内部指针
fsetpos()
fsetpos(fp, fpos_t file_point_position_name)
设置文件内部指针
ftell()
ftell(fp);
获取文件开头到当前位置的字节数
fseek()
fseek( fp, offest, origin)
origin = SEEK_SET / SEEK_CUR/ SEEK_END
移动文件内部指针
12.9 文件复制功能
开辟缓冲区,将从读取文件名中读到的内容放在缓冲区中,当缓冲区满了就写入复制文件名中
使用函数
malloc()
开辟内存的代码:
int bufferlen = 1024*4;
char * buffer = (char*)malloc(bufferlen);
free()
释放空间
收获
int function()
在函数中 return 1,当出错时,就不会返回1
开辟内存的代码
int bufferlen = 1024*4;
char *buffer = (char *) malloc(bufferlen);
使用完内存,要释放内存
free(buffer);
文件指针指向目标文件的代码
FILE *fpr; char *read_file = "D:\demo.txt";
if( (fpr = fopen(read_file, "rb+"){……}
12.8 随机读写文件
实现目标:从键盘输入三组学生信息,保存到文件中,然后读取第二个学生的信息。
使用函数:
rewind()
rewind(FILE *fp);
fseek()
fseek(FILE *fp, long offset, int origin);
origin 起始位置,C有三种起始位置
SEEK_SET
0
SEEK_CUR
1
SEEK_END
2
收获
1. 对于结构体指针,调用对应的元素时,使用 ‘->’ 符号
2. 对于结构体变量,调用对应元素时,使用 ‘ . ' 符号
3. fread(),fwrite(),首个填写的都是读取、写入的地址,如果是结构体变量的话,要给变量前面+取地址符&
4. 使用printf()输出时,不能用指针输出,只能用结构体变量/结构体数组输出。
12.7 格式化读写文件
fprintf()/fscanf()
除了需要在()中,多加一个 fp,以外,和printf、scanf的用法一致
fscanf()
fscanf(fp,)函数,指的是:从fp中读取数据
fscanf(stdin,),指的是:从stdin中读取数据
fprintf()
fprintf(fp,"",……);函数,指的是:从数组读取数据,放入文件中
当fprintf( )中的fp,改为sdtout时,即从数组读取数据,放入stdout中(放入标准输出装置:显示器中)。用法就和printf一样了
想要将数据显示到电脑上,还需要使用printf函数
归纳收获
fprintf(fp,),将后面的东西 放到fp中
输出:输出到standard output 文件中,所以数据指向fp(前面)
fscanf(fp,),将fp放入后面的东西中
输入:从standard input 文件输入到其他变量中,所以数据从fp指向数据(后面)
pa = boya; pa++; pa = boya 没有多余的代码
因为pa++变了。
12.6 以数据块的形式读写文件
使用 fread()、fwrite()函数
函数原型
size_t fread( void *ptr, size_t size, size_t count, FILE *fp);
返回值:
fread 实际读取到的count数目,= 0 表示没有读到数据(到文件结尾了)
对函数的解释
size_t 类型
表示对象所能达到的最大长度
void *ptr
用来存储读到/写入的数据
size
数据块的大小
count
数据块的个数
*fp
文件
必须用二进制的形式打开文件
rb
wb
ab
归纳收获
1. rewind()
使文件指针回到初始值
2. fread(),fwrite()
打开方式
必须以二进制的形式打开。
3. void *ptr
是指针,如果是结构体数组,要声明一个结构体指针指向该结构体,
想要给文件输入结构体时,必须定义一个结构体和对应的结构体指针,将结构体的地址赋值给对应的结构体指针。
因为
使用fread()的时候,第一个需要输入的东西是 void *ptr
12.5 以字符串的形式读写文件
读取文件
使用 fgets()函数
函数原型
int fgets( char *str, int n, FILE *fp);
函数返回值
读取成功,则返回 str字符数组首地址
读取失败,返回NULL
说明:
读取的n个字符中包括'\0'字符
即,如果要读取 100个字符,需要让 n = 101
fgets()函数,可以读取\n。并且遇到 \n就停止读取了
也就是说,fgets()最多读取一行字符
例子
归纳收获
在while里面放入fgets()函数进行判断,而不是判断fp是否=NULL……
读取到字符之后,就可以用printf()输出了。
写入文件
使用fputs()函数
函数原型
int fputs(char *str,FILE *fp)
函数返回值
读取成功则返回非0值
读取失败则返回EOF
例子
归纳收获
目前我只会在代码中给*str附上字符串,然后直接使用fputs()函数加到文件中
12.4 以字符形式读写文件
读取文件
使用 fgetc( )函数
函数原型
int fgetc( FILE *fp)
返回值
读取到的字符
EOF
当读取到文件末尾,或者读取文件出错时,会返回EOF(end of file)
如何判断是读取出错还是读到了文件的末尾?
使用 <stdio.h> 中的判断错误的函数
1. feof( )函数
2. ferror( )函数
判断是否出错的代码
二者用法一样,当返回值为非0时,表示出错,为0时,表示正常,
例子
代码:
归纳收获
fopen() 函数
函数体内需要输入两个字符串,(“文件路径”,“打开方式”)
puts()函数
输出的是字符串,不能是单个字符
输出单个字符的函数是
putchar()
关闭文件的函数体是
fclose( FILE *fp)
是指针名,不是文件路径
使用exit(0); 前提是?
#include<stdlib.h>
写入文件
使用 fputc( )函数
函数原型
int fputc( int char, FILE *fp)
返回值
当返回值 == EOF时,意味着输入出错
标准以字符形式写入文件的代码
打开文件
将一个字符写入文件
将一串字符写入文件(遇到\n结束输入)
关闭文件
归纳收获
1. 想要判断写入字符是否出错,直接将fputc()函数放到if()语句里面就行,不能先调用一边fputc(),再用if(fputc())判断一次。因为这代表同一个字符,写入文件两次(运行了两次fputc() )
2. 打开一次文件,只能进行读/写中的一项,完成后关闭文件,重新打开再进行另一项操作
写完文件之后,关闭文件,重新打开文件,再读
读完文件之后,关闭文件,重新打开文件,再写
12.3 文本文件和二进制文件的区别?
文本文件和二进制文件的异同?
二进制文件通常用来保存
视频
图片
音频
程序
等不可见的内容
物理意义上,二进制文件和文本文件并没有区别
我们之所以可以看见文本文件,是因为
文本使用ASCLL等字符编码格式,文本编辑器可以识别这些编码格式
使用文本编辑器打开二进制显示的是乱码,是因为
二进制文件使用的是 mp4/ git/ exe 等特殊编码格式,文本编辑器无法识别这些编码格式,所以是一堆乱码
二进制方式 和 文本方式的异同?
二进制方式和文本方式并没有本质上的区别
只有对换行符的处理不同
c
将 \n 作为换行符
Unix、Linux
同样将\n作为换行符
windows
将\r\n 作为换行符
所以 windows平台下,要严格对应打开方式
而Linux、Unix平台下,则都可以省略不写(因为t和b方式都一样)
12.2 如何打开文件?
1. 要使用 fopen()函数,
fopen()的用法
形式:
FILE *fopen(char file_name, char open_mode);
2. 打开文件后获取的文件信息需要保存在 FILE结构体中(stdio.h自定义的专门用来存储文件信息的结构体)
2. 判断fopen()打开文件是否成功
需要用到 fopen( )的返回值
想要接受fopen()的返回值,就需要使用指针
形式:
FILE *fp = fopen( char file_name, char open_mode);
如果fopen()的返回值== NULL ,则打开文件失败,需要printf("fail to open the file_name");
3. 标准打开文件的代码:
代码:
4. 打开方式
读写权限
r
只读
w
写入&( 新建)
a
追加 &( 更新)
+
读写, (r 和 w、 a 的叠加)
r+
读写,(文件必须存在)
w+
w和r+的叠加
a+
a 和r+的叠加
读写方式
t
文本文件(默认)
b
二进制文件
5. 关闭文件
使用完文件之后,必须马上关闭文件,防止文件数据被损坏
使用fclose()函数
使用方法
int fclose(FILE *fp);
例子
fclose(fp);
标准关闭文件代码
好像只有打开文件需要检查是否打开成功,关闭文件的话,一般不用检查,直接写 fclose(fp)即可
代码:
12.1 文件是什么?
文件 = 硬件
操作系统中,系统将所有的硬件都映射成了文件
如:
文件:stdin
对应的硬件设备默认是键盘
gets()、scanf()等函数,默认从stdin中输入
文件:stdout
对应的硬件设备默认是显示器
puts()、printf()等函数,默认从stdout中输出
操作文件的正确流程
1. 打开文件
获取文件的信息
如文件名
读写位置
……
2. 读写文件
可以一个字符一个字符的读写
也可以一行一行的读写
若干字符读写
……
3. 关闭文件
断开与文件的联系
文件流
文件保存在硬盘中
在硬盘中保存的所有东西,必须复制到内存中,计算机才能进行操作
文件数据 才硬盘中 “流向” 内存 的过程,称作 ”文件流“
其他“流”
数据流
文件是数据源的一种
数据源还包括
数据库
网络
键盘
等
将数据在 数据源和内存之间传输 的过程,称作”数据流“
输入流
输入设备 和 内存之间的数据传输,称作”输入流“
输出流
……