Linux文件IO操作之IO编程(一)
1.文件操作(系统I/O)
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
mode:这个参数,只有在文件不存在时有效,指新建文件时指定文件的权限
返回值:
成功:成功返回打开的文件描述符
失败:-1
flags详细说明
必选项:
取值 | 含义 |
---|---|
O_RDONLY | 以只读的方式打开 |
O_WRONLY | 以只写的方式打开 |
O_RDWR | 以可读、可写的方式打开 |
可选项,和必选项按位或起来
取值 | 含义 |
---|---|
O_CREAT | 文件不存在则创建文件,使用此选项时需使用mode说明文件的权限 |
O_EXCL | 如果同时指定了O_CREAT,且文件已经存在,则出错 |
O_TRUNC | 如果文件存在,则清空文件内容 |
O_APPEND | 写文件时,数据添加到文件末尾 |
O_NONBLOCK | 对于设备文件, 以O_NONBLOCK方式打开可以做非阻塞I/O |
1.2.关闭文件close
int close(int fd);
功能:
关闭已打开的文件
参数:
fd : 文件描述符,open()的返回值
返回值:
成功:0
失败: -1, 并设置errno
1.3.从文件读数据read
ssize_t read(int fd, void *buf, size_t count);
功能:
把指定数目的数据读到内存(缓冲区)
参数:
fd : 文件描述符
buf : 内存首地址
count : 读取的字节个数
返回值:
成功:实际读取到的字节个数
失败: - 1
1.4.向文件写数据write
ssize_t write(int fd, const void *buf, size_t count);
功能:
把指定数目的数据写到文件(fd)
参数:
fd : 文件描述符
buf : 数据首地址
count : 写入数据的长度(字节)
返回值:
成功:实际写入数据的字节个数
失败: - 1
1.5.调整文件位置lseek
off_t lseek(int fd, off_t offset, int whence);
功能:
调整文件位置偏移量
参数:
fd : 文件描述符
offset:相对基准点的偏移大小
whence : 基准点
返回值:
成功:新文件位置偏移量(相对于文件开头的偏移)
失败: - 1
whence 详细说明
取值 | 含义 |
---|---|
SEEK_SET | 文件开头处 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件末尾处 |
1.6.参考代码
//=============================================================================
// File Name : IO_programme_1.c
// Author : FengQQ
//
// Description : 非缓冲文件系统IO操作
// Annotation :
//
// Created by FengQQ. 2020-9-24
//=============================================================================
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char* argv[])
{
int ret;
int fd;
unsigned long file_size;
char wr_buf[100] = "hello world,my name is caiji";
char rd_buf[100];
fd = open("test1.txt",O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IROTH);//打开文件
if(fd < 0)
{
printf("open file error...\r\n");
return -1;
}
ret = write(fd,wr_buf,sizeof(wr_buf)); //写入数据
if(ret < 0)
{
printf("write file error...\r\n");
return -1;
}
lseek(fd,0,SEEK_SET);
ret = read(fd,rd_buf,sizeof(rd_buf)); //读取数据
if(ret < 0)
{
printf("read file error...\r\n");
return -1;
}
printf("rd_buf = %s\r\n", rd_buf); //打印数据
file_size = lseek(fd,0,SEEK_END); //获取指定文件的当前位置偏移量
if(file_size < 0)
{
printf("file_size error...\r\n");
}
printf("file_size = %lu\n", file_size); //打印当前文件大小
close(fd); //关闭文件
return 0;
}
2.文件操作(标准I/O)
2.1.打开文件fopen()
FILE *fopen(const char *path, const char *mode);
功能:
获取指定文件的文件指针。
参数:
path:要打开的文件的路径名称
mode:打开文件的行为标志
返回值:
成功:文件指针
失败:NULL
mode详细说明
必选项:
取值 | 含义 |
---|---|
“r” | 以只读方式打开文件,要求文件必须存在。 |
“r+” | 以读写方式打开文件,要求文件必须存在。 |
“w” | 以只写方式打开文件,文件如果不存在将会创建新文件,如果存在将会将其内容清空。 |
“w+” | 以读写方式打开文件,文件如果不存在将会创建新文件,如果存在将会将其内容清空。 |
“a” | 以只写方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量被自动定位到文件末尾(即以追加方式写数据)。 |
“a+” | 以读写方式打开文件,文件如果不存在将会创建新文件,第一次用于写数据则文件位置偏移量被自动定位到文件末尾(即以追加方式写数据),如果第一次用于读数据,文件位置偏移位置会定位到文件开始。 |
2.2.关闭文件fclose
int fclose(FILE *fp);
功能:
闭指定的文件并释放其资源
参数:
fp : 即将要关闭的文件
返回值:
成功:0
失败: EOF
2.3.从文件读数据fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从指定文件读取若干个数据块
参数:
ptr : 自定义缓冲区指针。
size : 数据块大小
nmemb : 数据块个数
stream : 即将被读取数据的文件指针
返回值:
成功:读取的数据块个数,等于 nmemb
失败: 读取的数据块个数,小于 nmemb 或等于 0
2.4.向文件写数据fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:
将若干块数据写入指定的文件
参数:
ptr : 自定义缓冲区指针。
size : 数据块大小
nmemb : 数据块个数
stream : 即将被写入数据的文件指针
返回值:
成功:写入的数据块个数,等于 sinmembze
失败: 写入的数据块个数,小于 nmemb 或等于 0
2.5.调整文件位置fseek
int fseek(FILE *stream, long offset, int whence);
功能:
设置指定文件的当前位置偏移量
参数:
stream: 需要设置位置偏移量的文件指针
offset:新位置偏移量相对基准点的偏移
whence : 基准点
返回值:
成功:0
失败: - 1
whence 详细说明
取值 | 含义 |
---|---|
SEEK_SET | 文件开头处 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件末尾处 |
2.6.获取指定文件的当前位置ftell
long ftell(FILE *stream);
功能:
获取指定文件的当前位置偏移量
参数:
stream : 需要返回当前文件位置偏移量的文件指针
返回值:
成功:当前文件位置偏移量
失败:-1
2.7.将指定文件的当前位置偏移量设置到文件开头处rewind
void rewind(FILE *stream);
功能:
将指定文件的当前位置偏移量设置到文件开头处
参数:
stream : 需要设置位置偏移量的文件指针
返回值:
无
2.8.参考代码
//=============================================================================
// File Name : IO_programme_2.c
// Author : FengQQ
//
// Description : 缓冲文件系统IO操作
// Annotation :
//
// Created by FengQQ. 2020-9-24
//=============================================================================
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char* argv[])
{
int ret;
FILE *fp;
unsigned long file_size;
char wr_buf[100] = "hello world,my name is caiji";
char rd_buf[100];
fp = fopen("test2.txt","a+"); //打开文件:文件追加,可读可写,文件不存在则创建
if(fp == NULL)
{
printf("fopen file error...\r\n");
return -1;
}
ret = fwrite(wr_buf,sizeof(wr_buf),1,fp); //写入数据
if(ret < 0)
{
printf("fwrite file error...\r\n");
return -1;
}
rewind(fp); //将文件的当前位置偏移量设置到文件开头处
ret = fread(rd_buf,sizeof(rd_buf),1,fp); //读取数据
if(ret < 0)
{
printf("fread file error...\r\n");
return -1;
}
printf("rd_buf = %s\r\n", rd_buf); //打印数据
ret = fseek(fp, 0, SEEK_END); //设置指定文件的当前位置偏移量:SEEK_CUR:当前位置 ; SEEK_END:文件末尾处
if(ret < 0)
{
printf("fseek file error...\r\n");
}
file_size = ftell(fp); //获取指定文件的当前位置偏移量
if(file_size < 0)
{
printf("file_size error...\r\n");
}
printf("file_size = %lu\n", file_size); //打印当前文件大小
fclose(fp); //关闭文件
return 0;
}
Linux多任务编程之进程(二)
链接: link.(https://blog.csdn.net/qq_39721016/article/details/119204626?spm=1001.2014.3001.5501)