使用 c 在 linux 中创建具有给定名称和权限的文件
create file with given name and permissions in linux using c
我必须在 c create 中编写一个带有 2 个参数的函数:文件名和文件权限。 (例如:create("f","rwxr_xr_x") 此函数创建文件 f,它将获得 "rwxr_xr_x" 权限并将 return 0)如果文件已经存在或不能创建它将 return 一个不同于 0 的数字。
这是我想出的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int create(char *name, char *mode)
{
int fp = fopen(name, "r+");
if (fp > 0)
{
int i, n = 0;
for (i = 0; i < 9; i = i + 3)
{
int nr = 0;
if (mode[i] == 'r') nr += 4;
if (mode[i + 1] == 'w') nr += 2;
if (mode[i + 2] == 'x') nr += 1;
n = n * 10 + nr;
}
chmod(name, n);
return 0;
}
else
return -1;
}
int main(int argc, char* argv[])
{
if (argc != 3) printf("%s\n", "Error: Incomplet number of arguments!");
int fp;
fp = create(argv[1], argv[2]);
if (fp == 0) printf("%s\n", "File successfully created!");
else printf("%s\n", "Could not create file!");
return 0;
}
我尝试以 r+ 模式打开文件,然后使用 chmod 更改权限,{不确定这是否正确)。当我编译它时,我收到以下警告:“初始化从指针生成整数而不对行 int fp=fopen(name, r+)
进行强制转换。有人可以帮我解决这个问题并告诉我代码是否正确吗?我是 linux
更新
所以我按照建议做了一些更改,但我认为它仍然没有提供正确的权限(正如我所说的,我是 linux 的新手,所以我可能是错的)。这是我的代码现在的样子:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int create(char *name, char *mode)
{
int i,n=0;
for(i=0; i<9; i=i+3)
{
int nr=0;
if(mode[i]=='r') nr+=4;
if(mode[i+1]=='w') nr+=2;
if(mode[i+2]=='x') nr+=1;
n=n*8+nr;
}
int fl=creat(name, n);
printf("%d\n", n);
if(fl>0)
return 0;
else return -1;
}
int main(int argc, char* argv[])
{
if(argc != 3)
printf("%s\n", "Error: Incomplet number of arguments!");
int fp;
fp=create(argv[1], argv[2]);
if(fp==0) printf("%s\n", "File successfully created!");
else printf("%s\n", "Could not create file!");
return 0;
}
另外,如何检查文件是否已经存在?因为在那种情况下,我的函数必须 return 一个不同于 0 的值并打印一条错误消息
首先是这一行的问题:
int fp=fopen(name, "r+");
fopen
returns 类型的值 FILE *
而不是 int
所以该行应该是
FILE *fp=fopen(name, "r+");
这意味着你需要测试 fp
不是 NULL
不是 > 0
.
创建文件后,您还应该记得调用 fclose(fp)
关闭文件。
您处理权限的代码也是错误的。您通常在 shell 中传递给 chmod
命令的值是八进制的,而不是十进制的,所以这一行是错误的。
n=n*10+nr;
您想每次将 n
乘以 8。
由于它是一个位字段,您可以通过使用“|=”运算符来更改适当的位而不是使用加法来改进代码。
if(mode[i]=='r') nr |=4;
if(mode[i+1]=='w') nr |=2;
if(mode[i+2]=='x') nr |=1;
此外,您还应该真正检查以确保模式在循环之前至少有 9 个字符。
我必须在 c create 中编写一个带有 2 个参数的函数:文件名和文件权限。 (例如:create("f","rwxr_xr_x") 此函数创建文件 f,它将获得 "rwxr_xr_x" 权限并将 return 0)如果文件已经存在或不能创建它将 return 一个不同于 0 的数字。 这是我想出的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int create(char *name, char *mode)
{
int fp = fopen(name, "r+");
if (fp > 0)
{
int i, n = 0;
for (i = 0; i < 9; i = i + 3)
{
int nr = 0;
if (mode[i] == 'r') nr += 4;
if (mode[i + 1] == 'w') nr += 2;
if (mode[i + 2] == 'x') nr += 1;
n = n * 10 + nr;
}
chmod(name, n);
return 0;
}
else
return -1;
}
int main(int argc, char* argv[])
{
if (argc != 3) printf("%s\n", "Error: Incomplet number of arguments!");
int fp;
fp = create(argv[1], argv[2]);
if (fp == 0) printf("%s\n", "File successfully created!");
else printf("%s\n", "Could not create file!");
return 0;
}
我尝试以 r+ 模式打开文件,然后使用 chmod 更改权限,{不确定这是否正确)。当我编译它时,我收到以下警告:“初始化从指针生成整数而不对行 int fp=fopen(name, r+)
进行强制转换。有人可以帮我解决这个问题并告诉我代码是否正确吗?我是 linux
更新 所以我按照建议做了一些更改,但我认为它仍然没有提供正确的权限(正如我所说的,我是 linux 的新手,所以我可能是错的)。这是我的代码现在的样子:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
int create(char *name, char *mode)
{
int i,n=0;
for(i=0; i<9; i=i+3)
{
int nr=0;
if(mode[i]=='r') nr+=4;
if(mode[i+1]=='w') nr+=2;
if(mode[i+2]=='x') nr+=1;
n=n*8+nr;
}
int fl=creat(name, n);
printf("%d\n", n);
if(fl>0)
return 0;
else return -1;
}
int main(int argc, char* argv[])
{
if(argc != 3)
printf("%s\n", "Error: Incomplet number of arguments!");
int fp;
fp=create(argv[1], argv[2]);
if(fp==0) printf("%s\n", "File successfully created!");
else printf("%s\n", "Could not create file!");
return 0;
}
另外,如何检查文件是否已经存在?因为在那种情况下,我的函数必须 return 一个不同于 0 的值并打印一条错误消息
首先是这一行的问题:
int fp=fopen(name, "r+");
fopen
returns 类型的值 FILE *
而不是 int
所以该行应该是
FILE *fp=fopen(name, "r+");
这意味着你需要测试 fp
不是 NULL
不是 > 0
.
创建文件后,您还应该记得调用 fclose(fp)
关闭文件。
您处理权限的代码也是错误的。您通常在 shell 中传递给 chmod
命令的值是八进制的,而不是十进制的,所以这一行是错误的。
n=n*10+nr;
您想每次将 n
乘以 8。
由于它是一个位字段,您可以通过使用“|=”运算符来更改适当的位而不是使用加法来改进代码。
if(mode[i]=='r') nr |=4;
if(mode[i+1]=='w') nr |=2;
if(mode[i+2]=='x') nr |=1;
此外,您还应该真正检查以确保模式在循环之前至少有 9 个字符。