Linux环境下运行介绍

举报
梦笔生花 发表于 2024/08/14 22:26:40 2024/08/14
400 0 0
【摘要】 1. 文件编程函数介绍如果在Linux系统下学习C语言,就会了解到两套文件编程接口函数:C语言标准的文件编程函数: fopen、fread 、fwrite 、fcloseLinux下提供的文件编程函数: open、read、write、close传参的区别:基于文件指针: fopen fclose fread fwrite 比较适合操作普通文件。基于文件描述符: open close rea...

1. 文件编程函数介绍

如果在Linux系统下学习C语言,就会了解到两套文件编程接口函数:

C语言标准的文件编程函数: fopenfread fwrite fclose

Linux下提供的文件编程函数: openreadwriteclose

传参的区别:

基于文件指针: fopen fclose fread fwrite 比较适合操作普通文件。

基于文件描述符: open close read write 比较适合操作设备文件。

2. C语言标准库提供的文件编程函数

下面介绍C语言标准库提供的文件编程函数,一般对文件常用的操作就是:创建(打开)、读、写、关闭。

其他的函数用法同理,只要把这4个函数学会了,基本的文件操作已经可以完成了。

#include

FILE *fopen(const char *path, const char *mode);

函数功能: 打开或者创建文件

函数参数:

const char *path 填文件的路径

const char *mode 填权限。比如: wb rb a+b

函数返回值: 文件打开或者创建成功返回对应的文件指针.

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

函数功能: 读文件

函数参数:

void *ptr :读取数据存放的缓冲区。

size_t size :每次读取的大小

size_t nmemb :每次读取的次数

FILE *stream :读取文件

返回值: 读取成功的次数。

比如: fread(buff,1,1000,fp); 从fp文件里读取1000个字节的数据到buff里。

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

函数功能: 写文件

函数参数:

void *ptr :将要写入的数据缓冲区首地址。

size_t size :每次写入的大小

size_t nmemb :每次写入的次数

FILE *stream :写入的文件

返回值: 写入成功的次数。

比如: fwrite(buff,1,1000,fp); 向fp文件里写1000个字节的数据,数据从buff里获取。

int fclose(FILE *fp);

函数功能: 关闭打开的文件。

3. Linux下的系统函数: 文件编程函数

Linux下也有一套系统函数,用于文件操作,这些函数在Linux下常用于读写设备文件;当然,读写普通文件也是一样,普通文件也是磁盘上的数据,也是操作块设备驱动。

#include

#include

#include

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

函数功能: 打开或者创建文件

函数参数:

const char *pathname : 文件的路径

int flags :打开文件的权限.

比如: O_RDONLY O_WRONLY O_RDWR O_CREAT

mode_t mode :创建文件时指定文件本身的权限.

比如:

S_IRWXU 00700 user (file owner) has read, write and execute permission

S_IRUSR 00400 user has read permission

S_IWUSR 00200 user has write permission

S_IXUSR 00100 user has execute permission

S_IRWXG 00070 group has read, write and execute permission

S_IRGRP 00040 group has read permission

S_IWGRP 00020 group has write permission

S_IXGRP 00010 group has execute permission

S_IRWXO 00007 others have read, write and execute permission

S_IROTH 00004 others have read permission

S_IWOTH 00002 others have write permission

S_IXOTH 00001 others have execute permission

返回值: (返回文件描述符--小整数)文件打开成功值>=0 否则<0

示例: open("123.c",O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);

创建一个123.c的新文件,并且指定该文件的权限是最高权限. chmod 777 123.c一样

ssize_t read(int fd, void *buf, size_t count);

函数功能: 读文件

函数参数:

int fd :文件描述符. ---表示已经打开的文件。

void *buf :读取数据存放的缓冲区.

size_t count :读取字节数量.

返回值: 成功读取的字节数量.

ssize_t write(int fd, const void *buf, size_t count);

函数功能: 写文件

函数参数:

int fd :文件描述符. ---表示已经打开的文件。

void *buf :将要写入到文件的数缓冲区首地址.

size_t count :写入的字节数量.

返回值: 成功写入的字节数量.

int close(int fd);

函数功能: 关闭已经打开的文件.

4. 案例: 实现文件拷贝功能(fopen)

例如: cp 123.c 456.c 将123.c的数据拷贝到456.c文件里。

注意: 下面这个代码需要在命令行上运行,需要给main函数传参。如果是在windows下IED软件里运行,可以将传参代码屏蔽掉,改成让用户输入,或者直接把参数 固定也可以。

#include

//实现: cp 123.c 456.c

int main(int argc,char **argv)

{

if(argc!=3)

{

printf("参数: ./a.out <源文件> <目标文件>\n");

return 0;

}

/*1. 打开源文件*/

FILE *src_fp=fopen(argv[1],"rb");

if(src_fp==NULL)

{

printf("%s 文件打开失败.\n",argv[1]);

return -1;

}

/*2. 创建新文件*/

FILE *new_fp=fopen(argv[2],"wb");

if(new_fp==NULL)

{

printf("%s 文件创建失败.\n",argv[2]);

fclose(src_fp);

return -2;

}

/*3. 实现文件的拷贝*/

unsigned char buff[1024];

unsigned int cnt;

while(1)

{

cnt=fread(buff,1,1024,src_fp);

fwrite(buff,1,cnt,new_fp);

if(cnt!=1024)break;

}

/*4. 关闭文件*/

fclose(new_fp);

fclose(src_fp);

return 0;

}

5. 案例: 实现文件拷贝功能(open)

例如: cp 123.c 456.c 将123.c的数据拷贝到456.c文件里。

#include

#include

#include

#include

//实现: cp 123.c 456.c

int main(int argc,char **argv)

{

if(argc!=3)

{

printf("参数: ./a.out <源文件> <目标文件>\n");

return 0;

}

/*1. 打开源文件*/

int fd_src=open(argv[1],O_RDONLY);

if(fd_src<0)

{

printf("源文件打开失败.\n");

return -1;

}

/*2. 创建新文件*/

int fd_new=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);

if(fd_new<0)

{

printf("新文件创建失败.\n");

close(fd_src);

return -2;

}

/*3. 拷贝文件*/

unsigned char buff[1024];

int cnt;

while(1)

{

cnt=read(fd_src,buff,1024);

write(fd_new,buff,cnt);

if(cnt!=1024)break;

}

/*4. 关闭文件*/

close(fd_src);

close(fd_new);

return 0;

}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。