目录
1、Linux系统提供的文件编程API
1.1打开文件:open
1.2创建文件creat函数
1.3写入文件write函数
1.4读取文件read函数
1.5文件光标位置lseek函数
2、另外一组文件编程API
2.1文件打开函数fopen
2.2读文件函数fread
2.3写文件函数fwrite
2.4文件光标位置函数fseek
2.4文件关闭函数fclose
2.5fgetc函数
1、Linux系统提供的文件编程API
打开 open
读写 write/read
光标定位 lseek
关闭 close
1.1打开文件:open
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);参数一:pathname 要打开的文件名(含路径,缺省为当前路径)
参数二:flags 文件的打开方式,有以下选项
O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开
当我们附带了访问权限后,打开的文件就只能按照这种权限来操作
以上三个常数中应当只选定一个。下列常数是可以选择的(可一个可多个也可以不选择,用|隔开)
O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的权限
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则函数值返回-1(可以和O_CREAT配合使用,用来判断文件是否存在)
O_APPEND 每次写时都加到文件的尾端
O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或者只写成功打开,则长度截短为0(就是把里面的内容都删掉)
参数三:一定是在flags中使用了O_CREA标志,mode记录待创建的文件的访问权限
返回值:返回新的文件描述符(非负整数),如果发生错误则返回-1
1.2创建文件creat函数
1.3写入文件write函数
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
参数一:文件描述符,由open或者creat函数返回参数二:需要写入的数据指针
参数三:写入数据的长度
返回值:成功写入的字节数,如果出错则返回-1
1.4读取文件read函数
函数原型:
ssize_t read(int fd, void *buf, size_t count);
参数一:文件描述符,由open或者creat函数返回
参数二:读取到的数据存放的位置
参数三:读取数据的长度,指针偏移量,从光标的位置开始读buf个字节的数据
返回值:如果成功则返回读取到的字节数,返回0则表示光标位置在文件的尾,发生错误则返回-1
1.5文件光标位置lseek函数
函数原型:
off_t lseek(int fd, off_t offset, int whence);
参数一:文件描述符,由open或者creat函数返回参数二:偏移量,正数向后偏移,负数向前偏移
参数三:偏移方式
SEEK_SET:光标位置为文件头,偏移量为参数二设置的偏移量
SEEK_CUR:偏移量为光标位置加上参数二设置的偏移量
SEEK_END:光标位置为文件尾,偏移量为文件大小加偏移量字节
返回值:返回光标偏移之后的位置,从文件头开始计算。如果发生错误则返回-1
1.6文件关闭close函数
函数原型:
int close(int fd);
参数一:文件描述符,由open或者creat函数返回
返回值:成功返回0,失败返回-1
标准输入0:读取键盘的输入:read
标准输出1:写到屏幕:write
标准错误输出0
在Linux文件可分为动态文件与静态文件,动态文件是我们打开的文件在缓冲区里面的文件,而静态文件存放在外存当中。调用close时就会将动态文件中的内容保存到磁盘的静态文件中。
2、另外一组文件编程API
fopen、fread、fwrite、fseek、fclose、fgetc、fputc、feof
作用与上面的都差不多
2.1文件打开函数fopen
fopen函数原型
FILE *fopen(const char *filename, const char *mode)
参数一:filename -- 字符串,表示要打开的文件名称。
参数二:mode -- 字符串,表示文件的访问模式
返回值:该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误
2.2读文件函数fread
fread函数原型
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数一:ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。读取文件的存放位置
参数二:size -- 这是要读取的每个元素的大小,以字节为单位。
参数三:nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
参数四:stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回值:成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
2.3写文件函数fwrite
fwrite函数原型
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数一:ptr -- 这是指向要被写入的元素数组的指针。
参数二:size -- 这是要被写入的每个元素的大小,以字节为单位。
参数三:nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
参数四:stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流
返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
2.4文件光标位置函数fseek
fseek函数原型
int fseek(FILE *stream, long int offset, int whence)
参数一:stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
参数二:offset -- 这是相对 whence 的偏移量,以字节为单位。
参数三:whence -- 这是表示开始添加偏移 offset 的位置,其参数与lseek函数的whence一样
返回值:如果成功,则该函数返回零,否则返回非零值。
2.4文件关闭函数fclose
fclose函数原型
int fclose(FILE *stream)
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。
返回值:如果流成功关闭,则该方法返回零。如果失败,则返回 EOF
2.5fgetc函数
作用:从指定的流 stream 获取一个字符(一个无符号字符),并把位置标识符往前移动
函数原型:
int fgetc(FILE *stream)
参数一:tream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流
返回值:该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或
发生读错误,则返回 EOF。
3、fopen与open的区别
fopen与open的区别
fopen
- 语言:
fopen
是标准C库中的函数,用于在C语言中打开文件。- 用途:
fopen
主要用于打开文件以供读取或写入。它返回一个指向FILE
结构的指针,该结构包含有关文件的信息。open
- 语言:
open
是Unix/Linux系统中的系统调用,用于在低级别(更接近硬件)上打开或创建文件。- 用途:
open
可以用于在文件系统中打开或创建文件,并返回文件描述符(file descriptor),而不是FILE
结构。总体而言,
fopen
更加抽象和易用,适用于C语言中的文件操作;而open
更底层,直接与文件描述符交互,适用于Unix/Linux系统编程。在一般情况下,如果你在C语言中进行文件操作,推荐使用fopen
。如果你在进行系统级别的编程,可能会使用open
以及其他底层的系统调用。