第1关:文件的创建
任务描述
在Linux系统中,如果要对一个文件进行操作,首先要求文件已经存在,如果文件不存在,则需要创建文件。
本关任务:学会使用C
语言在Linux系统中创建文件操作。
相关知识
文件的创建操作是 I/O
操作的第一步。在Linux系统中creat
系统调用可以实现对文件的创建。本关只介绍文件创建函数的使用方法。
在Linux系统中可以使用man
命令来查询这些函数的使用方法。具体的查询命令为: man 2 函数名
其中,2
表示查找系统调用函数,关于文件的创建、打开和关闭函数都是系统调用函数,因此使用2
作为man
命令的第一个参数。
案例演示1: 查询creat
函数的使用方法可以使用以下命令: man 2 creat
[查询结果]
通过man
命令可以查询常用的系统调用函数的使用方法。
文件的创建
创建文件的系统调用函数是creat
,具体的说明如下:
- 需要的头文件如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
- 函数格式如下:
int creat (const char *pathname,mode_t mode);
参数说明: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
。详细代码如下所示:
#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
。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
- 在当前目录下创建一个名为
testFile
的文件,并设置其权限为651
。
测试说明
本关的测试需要用户在右侧代码页中补全代码,然后点击评测按钮,平台会自动验证用户是否按照要求去检测结果。
真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克 开始你的任务吧,祝你成功!
如果你觉得这一关的内容对你有帮助,请你在下面点赞。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
/********** BEGIN **********/
int ret=creat("testFile",S_IRUSR|S_IWUSR|S_IRGRP|S_IXGRP|S_IXOTH);
if(ret==-1)
{
printf("创建文件夹失败\n");
}
else
{
printf("创建文件成功\n");
}
/********** END **********/
return 0;
}
第2关:文件打开与关闭
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
/************************
* fileName: 需要被打开的文件路径
**************************/
int open_File(char *fileName)
{
int fd = 0;
fd = open(fileName,O_RDONLY);
return fd;
}
void close_File(int fd)
{
int ret = close(fd);
if(ret == -1)
{
printf("关闭文件失败\n");
}
else
{
printf("关闭文件成功\n");
}
}
第3关:文件读写操作
#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));
if(writeSize == -1)
{
printf("写入文件失败\n");
}
else
{
printf("写入文件成功:写入%ld个字符\n", writeSize);
}
/********** END **********/
return writeSize;
}
/************************
* fd: 被打开文件的描述符
* buf: 存放读取的字符串指针(假设buf足够大)
*************************/
int readLine(int fd, char *buf)
{
int readSize = 0; //返回实际读取的字符个数
//提示:使用while循环每次只读取一个字符,判断该字符是否为换行符或者是否已经读取到文件末尾(读取到文件末尾返回值为0)
/********** BEGIN **********/
char ch;
int ret = read(fd, &ch, 1);
while(ret != 0 && ch != '\n')
{
buf[readSize++] = ch;
ret = read(fd, &ch, 1);
}
/********** END **********/
return readSize;
}
第4关:文件的删除
#include <stdio.h>
int main()
{
/********** BEGIN **********/
int ret = remove("testFile");
if (ret == -1)
{
printf("删除文件失败\n");
}
else
{
printf("删除文件成功\n");
}
/********** END **********/
return 0;
}