1.文件编程概述:
利用代码操作文件创建、打开、编辑等自动化执行
windows下的文件编辑:打开文档——>编辑文档——>保存文档——>关闭文档
而在Linux我们要使用编程调用api函数的方式进行文档的编辑:
打开:open 读写:write/read 光标定位:lseek 关闭:close
2.文件打开及创建(open)
包含头文件以及函数原型:Linux下:man 2 open可以查看对应手册
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
Pathname:要打开的文件名(含路径,缺省为当前路径)
Flags:权限 O_RDONLY:只读打开 O_WRONLY:只写打开 O_RDWR:可读可写打开
mode_t mode:权限模式
1.可读: r 4
2.可写: w 2
3.可执行 x 1
0600:6代表4+2(可读可写)
打开文件如果文件存在fd = 3,否则fd = -1
判断当fd = -1时候文件不存在则用creat创建文件,若fd = 3文件存在则输出提示
3.文件写入操作编程(write)(close)
close函数:关闭文件(一般在写入完成后执行文件的关闭)
函数原型:int close(int fd);
包含头文件以及函数原型:man 2 write可以查看手册
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
int fd:写入到刚打开的文件中
const void *buf:无符号类型的字符内容区
size_t count:写入的字节大小
文件的写入:
4.文件读取操作(read)
包含头文件以及函数原型:man 2 read可以查看手册
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
int fd:在刚刚打开的文件中
void *buf:将读取到的字符串存到buf中
size_t count:读取文件中的字符串内容
内容的读取:
在这里读取文件的时候有一个问题是Linux下的光标当我们写完代码后关闭文档文件的光标是显示在代码的末尾这时候我们去读取readBuf里面存在的字节都会为0和空内容这里有两个解决方案:(1):关闭文件再打开文件 (2):利用光标移动函数操作(lseek)
5.文件光标移动操作(lseek)
包含头文件以及函数原型:man 2 lseek可以查看手册
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
int fd:打开文件
off_t offset:偏移值(向前向后偏移多少字节)
int whence:如下参数
SEEK_SET:指向文档头 SEEK_END:指向文档尾 SEEK_CUR:当前光标位
利用lseek将光标指向文档头:
利用lseek计算文件存了多少个字节:
6.文件打开创建的补充
O_EXCL:如果同时指向了OCREAT,而文件已经存在。则出错。
O_APPEND :追加
O_TRUNC :属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则其长度截短为0
检测文件是否存在:
O_APPEND追加文字到文档末尾
file1文档中包含:
运行完如下代码后 :
O_TRUNC :相当于重新在文档中删除所有写入新东西
创建文件creat函数:
包含头文件以及函数原型:man 2 creat可以查看手册
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int creat(const char *pathname, mode_t mode);
const char *pathname:要创建的文件名(包含路径、缺省为当前路径)
mode_t mode:创建模式//可读可写可执行
S_IRUSR 4 可读
S_IWUSR 2 可写
S_IXUSR 1 可执行
S_IRWXU 7 可读、写、执行
7.文件操作原理简述
8.文件操作小应用之实现cp指令
argc: 参数表示命令行中参数的个数(注意 文本名本身也是一个参数),rgc的值是在输入命令行时由系统按 实际参数的个数自动赋予的。
argv :参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组 的长度即为参数个数。数组元素初值由系统自动赋予。
实际案例:实现cp命令的代码
思路:
代码
执行过程:
代码优化: 因为前面的readBuf = 1024有点浪费所有我们动态开辟内存空间
13.标准C库对文件操作引入
14.标准C库打开创建文件夹读写文件光标移动
(1)fopen函数:
#include<stdio.h>//头文件
FILE *fopen(const char *path, const char *mode);
path:文件路径
mode:以什么权限打开,要用双引号
它的返回值并不是文件描述符
若失败返回NULL
若操作成功返回FILE指针
操作方式和文件描述符类似
代码:
(2)fwrite函数:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr: 表示缓冲区
size: 代表一条记录的长度
nmemb: 代表写入长度的个数
stream: 表示要写入哪个文件(已打开文件的指针,一般就是fopen的返回值)
返回值:读或写的记录数,成功时返回的记录数等于 nmemb,出错或读到文件末尾时返回的记录数小于 nmemb,也可能返回 0。
代码:
(3)fread函数:
#include <stdio.h>//头文件
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ptr: 表示缓冲区
size: 代表一条记录的长度
nmemb: 代表写入长度的个数
stream: 表示要写入哪个文件(已打开文件的指针,一般就是fopen的返回值)
返回值:Fread()会返回实际读取到的nmemb数目,
也可能返回0,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,
这时必须用feof()或ferror()来决定发生什么情况。
代码:
(4)fseek函数:
#include <stdio.h>//头文件
int fseek(FILE *stream, long offset, int whence);
//用法和lseek类似,作用定位光标
15.标准C库写入结构体到文件
16.文件其它函数讲解及文件收尾
(1)fputc函数:
#include <stdio.h>//头文件
int fputc(int c, FILE *stream);
c:表示要写入的字符
stream:表示要写入哪个文件(已打开文件的指针,一般就是fopen的返回值)
(2) feof函数:
int feof(FILE *stream);
作用:测试是否到达文件的尾巴,
若没有则返回0,
若到达则返回非0。
(3)fgetc函数:
int fgetc(FILE *stream);
作用:将文件中的字符一个个读到返回的c中,然后再printf输出