cp指令:
src 源文件 des 目标文件
执行流程:
- 打开源文件(src)open
- 打开目标文件(des) open
- 写入目标文件 write
- 读取src文件到缓存数组 read
- 关闭目标文件和源文件 close
- ./a.out src.c des.c
操作流程:
按步骤编写程序,
准备要复制的文件:
cp demo1 demo2 demo4
demo2 的内容复制到demo4中,如果没有demo4 则创建。
vimfiff:是 Vim 编辑器的一个非常有用的功能,它允许你并排查看两个或三个文件,并高亮显示它们之间的差异。这对于比较文件、合并更改或审查代码特别有用。
补充:
学习中用到的C语言标准库中的函数:
memset: 用于填充内存块,在定义的string.h头文件中,可以用于将指定的内存区域的每个字节都设定为特定的值。函数经常用于初始化或者清零内存区域,或者设置为某一特定的值。
原型:
void *memset(void*s,int c ,size_t n);
s
:指向要填充的内存区域的指针。c
:要填充的值。这个值会被转换为一个无符号字符(通常是 8 位),然后用来填充内存。n
:要填充的字节数。
touch:一个命令行工具,用于创建新的文件,更新现有文件的访问,和修改时间戳
更完善的程序书写以及熟悉cp指令:
vi dec.c 进入文件查看,文件内容相同,证明操作成功,。
fopen函数以及fclose函数:
fopen , fread , fwrite , fclose 函数都属于标准c库。
include standard io lib
open,close ,write, read属于Linux的系统调用。
可移植性来讲,fopen强于open函数。
注意的是:fopen在用户态是缓存的,而open在用户态是没有缓存的
与open函数不同的是:打开一个文件,返回的是该文件的指针。
函数原型:
FILE * fopen(constchar *path , cost char *mode)
/*
* @description : 打开一个文件
* @param ‐ path : 指定文件路径,如:"./test.txt"
* @param ‐ mode :指定文件的打开方式,如下图:
* @return : 成功,返回指向该文件的文件指针; 若失败,返回 NULL */
参数说明:第一个参数为要打开的文件的文件路径以及文件名,第二个参数表示打开文件的方式。
mode:
- r:只读方式打开,文件必须存在
- r+:可读写,文件必须存在
- rb+:打开二进制文件,可以读写
- rt+:打开文本文件,可读写
- w:只写,文件存在则文件长度清0,文件不存在则建立该文件
- w+:可读写,文件存在则文件长度清0,文件不存在则建立该文件
- a:附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾,EOF符保留
- a+:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,EOF符不保留 wb:打开二进制文件,只写
- wb+:打开或建立二进制文件,可读写
- wt+:打开或建立文本文件,可读写
- at+:打开文本文件,可读写,写的数据加在文本末尾
- ab+:打开二进制文件,可读写,写的数据加在文件末尾
返回值:
文件打开则返回指向打开该文件的指针(FILE结构),文件打开失败错误上存errorcode(错误代码)。
fclose文件:
关闭一个文件流。使用fclose可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓存区。
函数原型:int fclose(FILE*stream)
/*
* @description :关闭一个已打开的流
* @param ‐ stream :文件指针(流)
* @return : 成功,返回0; 若失败,返回EOF
*/
简单的程序书写举例:
ls -l 查看相关文件权限:
fread函数、fwrite函数和fseek函数:
fread函数:
从文件中读取数据到指定的地址中。
函数原型:
size_t fread(void*buff , size_t size, size_t count , FILE* stream)
/*
* @description :对已打开的流进行数据读取
* @param ‐ ptr :指向 数据块的指针
* @param ‐ size :指定读取的每个数据项的字节数
* @param ‐ nmemb : 指定要读取的数据项的个数
* @param ‐ stream :要读取的文件流
* @return : 返回实际读取数据项的个数;
*/
- 参数: 第一个参数为接收数据的指针(buff),也即数据存储的地址
- 第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节
- 第三个参数为元素个数,即要读取的数据大小为size的元素个素
- 第四个参数为提供数据的文件指针,该指针指向文件内部数据
- 返回值:读取的总数据元素个数
简单程序书写记忆:
mm书写内容:
编译:
执行:
fwrite函数:
函数原型:int fwrite(void*buffer,intsize,intcount,FILE*fp)
/*
* @description :对已打开的流进行写入数据块
* @param ‐ ptr :指向 数据块的指针
* @param ‐ size :指定写入的每个数据项的字节数,如调用sizeof(char)
* @param ‐ nmemb :指定写入的数据项的个数
*@param ‐ stream :要写入的文件流
* @return : 返回实际写入的数据项的个数
*/
说明:
- fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放 到从buffer开始的内存中; buffer是存放读入数据的起始地址(即存放何处)。
- fwrite()──从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件 中。buffer是要输出数据在 内存中的起始地址(即从何处开始输出)。
- 一般用于二进制文件的处理。
简单程序书写记忆:
fseek函数:
重定位文件内部的指针;
函数原型:int fseek(FILE *stream,long offset,int framewhere)
- 参数:第一个为文件指针,第二个是指针的偏移量,第三个是指针偏移起始位置
- 返回值:重定位成功返回0,否则返回非零值
需要注意的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我 们感兴趣的数据上,重定位主要是这个目的。
说明:执行成功,则stream指向以fromwhere为基准,偏移offset个字节的位置。执行失败(比方说offset偏移的位 置超出了文件大小),则保留原来stream的位置不变
分别用3个宏
- SEEK_SET 既0 文件开头
- SEEK_CUR 既1 文件当前位置
- SEEK_END 既2 文件结尾
但不推荐用数字 最好用宏 简言之:
1. fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;
2. fseek(fp,100L,SEEK_CUR);把fp指针移动到离文件当前位置100字节处;
3. fseek(fp,100L,SEEK_END);把fp指针退回到离文件结尾100字节处。
这里的五种函数都是以C语言的#include<stdio.h>为头文件。
熟练的使用以上四种函数可以从文件中获取对我们有用的数据型。前提是对文件格式很了解,比如一个DIB位图文件。就可以读取出他的文件中的头信息和像素点信息。