Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何设置输出文件模式权限(rw-rw-)_C_Output_Chmod - Fatal编程技术网

C 如何设置输出文件模式权限(rw-rw-)

C 如何设置输出文件模式权限(rw-rw-),c,output,chmod,C,Output,Chmod,我已经创建了一个代码,可以复制用户建议的文件。我想知道的是:如何设置输出文件模式以及如何确定此代码中的输出文件模式权限 #include <stdio.h> #include <stdlib.h> int main() { char c; char source_file, target_file; FILE *in, *out; printf("Enter name of file to copy\n"); gets(source_file); printf(

我已经创建了一个代码,可以复制用户建议的文件。我想知道的是:如何设置输出文件模式以及如何确定此代码中的输出文件模式权限

#include <stdio.h>
#include <stdlib.h>

int main()
{
char c;
char source_file, target_file;
FILE *in, *out;

printf("Enter name of file to copy\n");
   gets(source_file);
printf("Enter name of file to copy to\n");
  gets(target_file);
in = (source, O_RDONLY);
out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);

/* error handing */
if( in == NULL )
{
   printf("Error. \n");
   exit(0);
}

printf("Enter the copied file name \n");
gets(target_file);

out = fopen(target_file, "w");

/*error handing*/
if( out == NULL )
{
  fclose(in);
  printf("File opening error.\n");
  exit(0);
}

while(( c = fgetc(in) ) != EOF )
  fputc(c,out);

fclose(in);
fclose(out);

return 0;
}
使用标准I/O控制文件权限 标准I/O库的缺点之一是无法控制所创建文件的权限,这主要是因为这些权限与平台相关,而不是C标准所允许的权限。POSIX函数允许您在创建文件时控制文件的权限

对于类似POSIX的系统,您可以使用或系统调用。你需要知道你的rw模式是octal 0666

chmod(target_file, 0666);
fchmod(fileno(out), 0666);
功能可能会失效;你应该检查一下他们没有

您也可以使用该函数或小心地使用命令来影响默认权限。例如,在shell中设置umask 022意味着不会创建可由组或其他人写入的文件

修改修改后的代码 您不需要担心打开阅读文件的权限,至少您很少需要这样做。 担心您写入的文件的权限更正常。 您当前的代码提案是:

in = (source, O_RDONLY);
out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
这不会调用open,而是为两个FILE*变量指定一个整数值,这两个变量应该会生成编译器警告。请注意,逗号表达式先计算表达式的LHS,然后计算RHS,得到RHS作为总值。O_RDONLY在经典意义上是0;S_IRUSR etc项的组合不是零

如果要使用这些选项打开文件,则需要以下内容:

int fd_i = open(source_file, O_RDONLY);
if (fd_i < 0)
    …report error opening source_file…
FILE *in = fdopen(fd_i, "r");
if (in == 0)
    …report error creating file stream for source_file…

int fd_o = open(target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (fd_o < 0)
    …report error opening target_file…
FILE *out = fdopen(fd_o, "w");
if (out == 0)
    …report error creating file stream for target_file…
但是,我可能不会将其用于输入文件-我会像您最初那样直接使用fopen-但我可能会将其用于输出文件。

使用标准I/O控制文件权限 标准I/O库的缺点之一是无法控制所创建文件的权限,这主要是因为这些权限与平台相关,而不是C标准所允许的权限。POSIX函数允许您在创建文件时控制文件的权限

对于类似POSIX的系统,您可以使用或系统调用。你需要知道你的rw模式是octal 0666

chmod(target_file, 0666);
fchmod(fileno(out), 0666);
功能可能会失效;你应该检查一下他们没有

您也可以使用该函数或小心地使用命令来影响默认权限。例如,在shell中设置umask 022意味着不会创建可由组或其他人写入的文件

修改修改后的代码 您不需要担心打开阅读文件的权限,至少您很少需要这样做。 担心您写入的文件的权限更正常。 您当前的代码提案是:

in = (source, O_RDONLY);
out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
这不会调用open,而是为两个FILE*变量指定一个整数值,这两个变量应该会生成编译器警告。请注意,逗号表达式先计算表达式的LHS,然后计算RHS,得到RHS作为总值。O_RDONLY在经典意义上是0;S_IRUSR etc项的组合不是零

如果要使用这些选项打开文件,则需要以下内容:

int fd_i = open(source_file, O_RDONLY);
if (fd_i < 0)
    …report error opening source_file…
FILE *in = fdopen(fd_i, "r");
if (in == 0)
    …report error creating file stream for source_file…

int fd_o = open(target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (fd_o < 0)
    …report error opening target_file…
FILE *out = fdopen(fd_o, "w");
if (out == 0)
    …report error creating file stream for target_file…

但是,我可能不会将其用于输入文件-我会像您最初那样直接使用fopen-但我可能会将其用于输出文件。

提示:您已经知道如何更改模式,您可以将其作为此问题的标记之一。对于另一个,要获得文件权限,请使用。这是否像在关闭文件之前在某个位置添加chmodout 666一样简单?除非它不接受file*参数。相反,您可以与一起使用fchmod。请不要使用gets,即使是在玩具程序中。它是致命的;养成这种坏习惯是很不好的。提示:您已经知道如何更改模式,可以将其作为此问题的标记之一。对于另一个,要获得文件权限,请使用。这是否像在关闭文件之前在某个位置添加chmodout 666一样简单?除非它不接受file*参数。相反,您可以与一起使用fchmod。请不要使用gets,即使是在玩具程序中。它是致命的;养成这种坏习惯是很不好的。改为使用fgets。将open命令更改为:out=opentarget_file,O_CREAT,S|IRUSR | S|u IWGRP | S|u IROTH | S|IWOTH;还可以吗?@user1021170:sorta-它将使用正确的权限创建文件,但文件描述符将打开以供读取,您需要O|u CREAT | O|u WRONLY或O|u CREAT | O|RDWR。您还需要一个文件描述符,而不是文件流指针int,而不是file*。您需要使用fdopen将文件描述符转换为文件流指针,或者需要更改后续代码以使用使用文件描述符而不是文件描述符的I/O调用
我更新了代码以反映你的反应。对于文件流指针,我需要做什么特别的事情吗?@user1021170:查看修改后的答案。是否将open命令更改为:out=opentarget_file,O_CREAT,S|IRUSR | S|IWGRP | S|IWGRP | S|IROTH | S|IWOTH;还可以吗?@user1021170:sorta-它将使用正确的权限创建文件,但文件描述符将打开以供读取,您需要O|u CREAT | O|u WRONLY或O|u CREAT | O|RDWR。您还需要一个文件描述符,而不是文件流指针int,而不是file*。您需要使用fdopen将文件描述符转换为文件流指针,或者需要更改后续代码以使用使用文件描述符而不是文件流的I/O调用。我更新了代码以反映您的响应。对于文件流指针,我需要做什么特别的事情吗?@user1021170:请参阅修改后的答案。