Linux之文件操作

目录

第1关:文件的创建

任务描述

相关知识

文件的创建

编程要求

答案:

第2关:文件打开与关闭

任务描述

相关知识

文件的打开

文件的关闭

编程要求

答案:

第3关:文件读写操作

任务描述

相关知识

文件的写操作

文件的读操作

编程要求

答案:

第4关:文件的删除

任务描述

相关知识

使用unlink函数删除文件

使用unlink函数删除文件

编程要求

答案:


第1关:文件的创建

任务描述

在Linux系统中,如果要对一个文件进行操作,首先要求文件已经存在,如果文件不存在,则需要创建文件。

本关任务:学会使用C语言在Linux系统中创建文件操作。

相关知识

文件的创建操作是 I/O 操作的第一步。在Linux系统中creat系统调用可以实现对文件的创建。本关只介绍文件创建函数的使用方法。

在Linux系统中可以使用man命令来查询这些函数的使用方法。具体的查询命令为: man 2 函数名 其中,2表示查找系统调用函数,关于文件的创建、打开和关闭函数都是系统调用函数,因此使用2作为man命令的第一个参数。

案例演示1: 查询creat函数的使用方法可以使用以下命令: man 2 creat

[查询结果]

通过man命令可以查询常用的系统调用函数的使用方法。

文件的创建

创建文件的系统调用函数是creat,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函数格式如下: int creat (const char *pathname,mode_t mode); 参数说明:

cpp 复制代码
pathname:需要创建文件的绝对路径名或相对路径名;
mode:用于指定所创建文件的权限;

常见的mode取值及其含义见下表所示:

mode 含义
S_IRUSR 文件所有者的读权限位
S_IWUSR 文件所有者的写权限位
S_IXUSR 文件所有者的执行权限位
S_IRGRP 所有者同组用户的读权限位
S_IWGRP 所有者同组用户的写权限位
S_IXGRP 所有者同组用户的执行权限位
S_IROTH 其他用户的读权限位
S_IWOTH 其他用户的写权限位
S_IXOTH 其他用户的执行权限位

函数返回值说明: 调用成功时,返回值为 文件的描述符(大于0的整数);调用失败时,返回值为-1并设置错误编号errno

案例演示1: 在当前目录下使用creat函数创建一个名为firstFile的文件,并设置文件的权限为644。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    int ret = creat("firstFile", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
    if (ret == -1)
    {
        printf("创建文件失败\n");
    }
    else
    {
        printf("创建文件成功\n");
    }
    
    return 0;
}

将以上代码保存为main.c文件中,编译执行。可以看到当前目录下存在firstFile文件,并且其权限为644

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

在当前目录下创建一个名为testFile的文件,并设置其权限为651

答案:
cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
    /********** BEGIN **********/

    creat("testFile", S_IRUSR|S_IWUSR |S_IRGRP|S_IXGRP|S_IXOTH);

    /********** END **********/

    return 0;
}

第2关:文件打开与关闭

任务描述

在Linux系统中,如果要对一个文件进行操作,操作前需要将这个文件打开。这样才能实现对该文件的操作。

本关任务:学会使用C语言在Linux系统中打开与关闭文件操作。

相关知识

文件的打开与关闭操作是 I/O 操作的第二步。在Linux系统中提供了以下两个系统调用函数用于打开和关闭文件操作,分别是openclose。本关将介绍文件的打开和关闭函数的使用方法。

使用man 2 函数名也可以查询这些函数的使用方法。

文件的打开

打开文件的系统调用函数是open,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

函数格式如下:

cpp 复制代码
int open(coust char *pathname, int flags);
int open(const char *pathname, int flags, made_t mode);

参数说明:

cpp 复制代码
pathname:需要被打开或创建的文件绝对路径名或相对路径名;
flags:用于描述文件的打开方式;
mode:用于指定所创建文件的权限(与上一关中creat函数中mode取值一致);

第一个open函数用于打开已经存在的文件。而第二个open函数可以创建一个不存在的文件且打开,该函数将flags参数设置为O_CREAT | O_WRONLY | O_TRUNC时等同于上一关中的creat函数。

常见的flags取值及其含义见下表所示:

flags 含义
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWY 以只读写方式打开文件
O_CREAT 若所打开文件不存在则创建此文件
O_TRUNC 若以只写或读写方式打开一个已存在文件时,将该文件截至 0
O_APPEND 向文件添加内容时将指针置于文件的末尾
O_SYNC 只在数据被写外存或其他设备之后操作才返回

函数返回值说明: 调用成功时,返回值为 文件的描述符(大于0的整数);调用失败时,返回值为-1并设置错误编号errno

案例演示1: 在当前目录下使用open函数以只读方式打开一个已存在且名为firstFile的文件。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    int ret = open("firstFile", O_RDONLY);
    if (ret == -1)
    {
        printf("打开文件失败\n");
    }
    else
    {
        printf("打开文件成功\n");
    }
    
    return 0;
}

将以上代码保存为openFile.c文件中,编译执行。

案例演示2: 在当前目录下使用open函数创建一个名为secondFile的文件,并设置文件的权限为644。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    int ret = open("secondFile", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
    if (ret == -1)
    {
        printf("创建文件失败\n");
    }
    else
    {
        printf("创建文件成功\n");
    }
    
    return 0;
}

将以上代码保存为secondFile.c文件中,编译执行。可以看到当前目录下存在secondFile文件,并且其权限为644

文件的关闭

关闭文件的系统调用函数是close,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <unistd.h>

函数格式如下: int close(int fd);

参数说明:

cpp 复制代码
fd:需关闭文件的描述符;

函数返回值说明: 调用成功时,返回值为 0;调用失败时,返回值为-1,并设置错误编号errno

案例演示1: 在当前目录下使用close函数关闭一个已经被打开的文件。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    int fd = open("firstFile", O_RDONLY);
    if (fd == -1)
    {
        printf("打开文件失败\n");
    }
    else
    {
        printf("打开文件成功\n");
    }
    
    int ret = close(fd);
    if(ret == -1)
    {
        printf("关闭文件失败\n");
    }
    else
    {
        printf("关闭文件成功\n");
    }
    
    return 0;
}

将以上代码保存为closeFile.c文件中,编译执行。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

补全open_File函数,使其以 方式打开一个文件,并返回文件描述符fd

补全close_File函数,使其关闭一个已经被打开的文件。

答案:
cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

/************************
 * fileName: 需要被打开的文件路径
*************************/
int open_File(char *fileName)
{
	int fd = 0;   //存放文件描述符
	/********** BEGIN **********/
	fd=open(fileName,O_RDONLY);
	/********** END **********/

	return fd;
}

/************************
 * fd: 需要被关闭的文件描述符
*************************/
void close_File(int fd)
{
	/********** BEGIN **********/
	close(fd);
	
	/********** END **********/
}

第3关:文件读写操作

任务描述

通过上一关的学习,我们学会了如何使用C语言来打开和关闭文件,本关将继续介绍对文件的读写操作。

本关任务:学会使用C语言在Linux系统中对文件进行读写操作。

相关知识

文件的读写是 I/O 操作的核心内容。上一关中已经介绍了如何打开和关闭一个文件,但是要实现文件的 I/O 操作就必须对其进行读写,文件的读写操作所用的系统调用分别是readwrite。本关将介绍文件的读写函数的使用方法。

使用man 2 函数名也可以查询这些函数的使用方法。

文件的写操作

写入文件的系统调用函数是write,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <unistd.h>

函数格式如下: ssize_t write(int fd, void *buf, size_t count);

参数说明:

cpp 复制代码
fd:表示将对之进行写操作的文件打开时返回的文件描述符;
buf:指向存放将写入文件的数据的缓冲区的指针;
count:表示本次操作所要写入文件的数据的字节数;

函数返回值说明: 调用成功时,返回值为所写入的字节数;调用失败时,返回值为-1并设置错误编号errno

案例演示1: 在当前目录下往firstFile文件中写入一个字符串。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
    int fd = open("firstFile", O_WRONLY);
    if (fd == -1)
    {
        printf("打开文件失败\n");
    }
    else
    {
        printf("打开文件成功\n");
    }
    
    char *data = "this is firstFile\n";
    ssize_t size = write(fd, data, strlen(data));
    if(size == -1)
    {
        printf("写入文件失败\n");
    }
    else
    {
        printf("写入文件成功:写入%ld个字符\n", size);
    }
    
    if(close(fd) == -1)
    {
        printf("关闭文件失败\n");
    }
    else
    {
        printf("关闭文件成功\n");
    }
    
    return 0;
}

将以上代码保存为writeFile.c文件中,编译执行。可以看到字符串被写入到firstFile文件中。

文件的读操作

读取文件的系统调用函数是read,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <unistd.h>

函数格式如下: ssize_t read(int fd, void *buf, size_t count);

参数说明:

cpp 复制代码
fd:表示将对之进行写操作的文件打开时返回的文件描述符;
buf:指向存放所读数据的缓冲区的指针;
count:读操作希望读取的字节数;

函数返回值说明: 调用成功时,返回值为本次读操作实际读取的字节数;调用失败时,返回值为-1并设置错误编号errno

案例演示1: 读取当前目录下firstFile文件中的前4个字符。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
    int fd = open("firstFile", O_RDONLY);
    if (fd == -1)
    {
        printf("打开文件失败\n");
    }
    else
    {
        printf("打开文件成功\n");
    }
    
    char data[5] = "";
    ssize_t size = read(fd, data, sizeof(char)*4);
    if(size == -1)
    {
        printf("读取文件失败\n");
    }
    else
    {
        printf("读取文件成功:数据:%s\n", data);
    }
    
    if(close(fd) == -1)
    {
        printf("关闭文件失败\n");
    }
    else
    {
        printf("关闭文件成功\n");
    }
    
    return 0;
}

将以上代码保存为readFile.c文件中,编译执行。可以看到从firstFile文件中读取出了前4个字符。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

补全write_File函数,完成向文件写入字符串功能。并返回实际写入字符个数。

补全readLine函数,完成从文件中读取一行的功能(不包括换行符),并返回实际读取的字符个数(文件的换行符号为\n)。

答案:
cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

/************************
 * fd: 被打开文件的描述符
 * buf: 被写入字符串指针
*************************/
int write_File(int fd, char *buf)
{
	int writeSize = 0; //返回实际写入的字符个数

	/********** BEGIN **********/
	writeSize=write(fd,buf,strlen(buf));
	
	/********** END **********/

	return writeSize;
}

/************************
 * fd: 被打开文件的描述符
 * buf: 存放读取的字符串指针(假设buf足够大)
*************************/
int readLine(int fd, char *buf)
{
	int readSize = 0;  //返回实际读取的字符个数
	
	//提示:使用while循环每次只读取一个字符,判断该字符是否为换行符或者是否已经读取到文件末尾(读取到文件末尾返回值为0)
	/********** BEGIN **********/
    char c;
    while(read(fd,&c,1)&&c!='\n')
    {
        buf[readSize++]=c;
    }
	
	/********** END **********/
	
	return readSize;
}

第4关:文件的删除

任务描述

通过前三关的学习,我们学会了如何使用C语言来创建、打开/关闭和读写文件,本关将介绍如何删除一个已经存在的文件。

本关任务:学会使用C语言在Linux系统中删除文件操作。

相关知识

当不需要一个文件时,我们通常直接选中文件按下delete键对其删除,本关将介绍如何在Linux系统中使用C语言删除一个已经存在的文件。

在Linux系统中使用unlinkremove系统调用可以实现对文件的删除操作。

使用man 2 函数名或者man 3 函数名也可以查询这些函数的使用方法。

使用unlink函数删除文件

删除文件的系统调用函数是unlink,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <unistd.h>

函数格式如下:

cpp 复制代码
int unlink(const char *pathname);

参数说明:

cpp 复制代码
​​​​​​​pathname:需要删除的文件绝对路径名或相对路径名;

函数返回值说明: 调用成功时,返回值为0;调用失败时,返回值为-1并设置错误编号errno

案例演示1:

删除当前目录下的firstFile文件。详细代码如下所示:

cpp 复制代码
#include <unistd.h>
#include <stdio.h>
int main()
{
    int ret = unlink("firstFile");
    if (ret == -1)
    {
        printf("删除文件失败\n");
    }
    else
    {
        printf("删除文件成功\n");
    }
    
    return 0;
}

将以上代码保存为deleteFile1.c文件中,编译执行。可以看到当前目录下存在firstFile文件被删除了。

使用unlink函数删除文件

remove是删除文件的另一个函数,该函数是C语言的库函数,其本质是通过调用系统调用unlink来完成文件的删除操作,具体的说明如下:

需要的头文件如下:

cpp 复制代码
#include <stdio.h>

函数格式如下:

cpp 复制代码
int remove(const char *pathname);

参数说明:

cpp 复制代码
pathname:需要删除的文件绝对路径名或相对路径名;

函数返回值说明: 调用成功时,返回值为0;调用失败时,返回值为-1并设置错误编号errno

案例演示1: 删除当前目录下的secondFile文件。详细代码如下所示:

cpp 复制代码
#include <stdio.h>
int main()
{
    int ret = remove("secondFile");
    if (ret == -1)
    {
        printf("删除文件失败\n");
    }
    else
    {
        printf("删除文件成功\n");
    }
    
    return 0;
}

将以上代码保存为deleteFile2.c文件中,编译执行。可以看到当前目录下存在secondFile文件被删除了。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

删除当前目录下的testFile文件。

答案:
cpp 复制代码
#include <stdio.h>

int main()
{
	/********** BEGIN **********/
    unlink("testFile");
	/********** END **********/

	return 0;
}
相关推荐
AI服务老曹3 分钟前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频
风静如云1 小时前
OpenBMC:BmcWeb定义service
linux
sszdzq1 小时前
Docker
运维·docker·容器
book01211 小时前
MySql数据库运维学习笔记
运维·数据库·mysql
leoufung1 小时前
VIM FZF 安裝和使用
linux·编辑器·vim
bugtraq20212 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu
xmweisi2 小时前
【华为】报文统计的技术NetStream
运维·服务器·网络·华为认证
VVVVWeiYee2 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信
陆鳐LuLu3 小时前
日志管理利器:基于 ELK 的日志收集、存储与可视化实战
运维·elk·jenkins
CodeWithMe3 小时前
[ Vim ] 常用命令 and 配置
linux·编辑器·vim