程序未使用命令行上指定的名称创建文件
Program isn't creating file using name specified on the command line
对于这个程序,我应该将我的名字写入终端或用户给出的输出文件(case 'f'
)。
#include <stdio.h>
int main(int argc, char **argv)
{
// no output file print to screen, print name to terminal
if (argc < 2)
{
fprintf(stdout, "name\n");
}
//print name to output file given by user
else
{
int option;
int fFlag = 0;
while ((option = getopt(argc, argv, "f:")) != -1)
{
//if case 'f' print to output file
switch (option)
{
case 'f':
fFlag = 1; // flag indicates writing name to file
break;
//case f or error
case '?':
printf("error");
break;
}
}
//write to name to output file
if (fFlag)
{
FILE *file = fopen(argv[1], "w");
fprintf(file, "name");
}
}
return 0;
}
当我想将我的名字写入终端时,我的代码有效,但当我想将我的名字写入用户给定的文件时,它不起作用。代码编译并运行,但文件不存在。
命令行中的文件可能不存在。我应该在程序中创建文件吗?
我明白我做错了什么。谢谢大家!
除了评论者所说的之外,您还在使用 getopt
进行部分解析,因此其余部分应该使用它!
int main...
char *filename; /**1**/
...
case 'f':
fFlag = 1;
filename = optarg; /**2**/
....
FILE *file = fopen(filename , "w"); /**3**/
解释:f:
到 getopt
意味着 getopt
将尝试找到与 f
一起出现的选项。在 getopt
循环中,案例 'f'
,该选项被放入变量 optarg
中。至少对于 GNU getopt,这是指向 argv
的指针,因此您不必复制它。您可以将其指针值(在上面的 *2*
处)存储到您为此目的创建的变量中(*1*
)。然后您可以打开该特定文件,而不管它在 argv
(*3*
) 中的位置。请参阅 GNU getopt example 中选项 c
的处理。
编辑 你没有显示你正在使用的命令行,但我猜它类似于
./foo -f my-output-file.txt
— 在这种情况下 argv[1]
是 -f
并且 argv
[2]
是 my-output-file.txt
。 (argv[0]
是您的可执行文件的名称。)因此 fopen(argv[1], ...)
不是您想要的 ;) .
对于这个程序,我应该将我的名字写入终端或用户给出的输出文件(case 'f'
)。
#include <stdio.h>
int main(int argc, char **argv)
{
// no output file print to screen, print name to terminal
if (argc < 2)
{
fprintf(stdout, "name\n");
}
//print name to output file given by user
else
{
int option;
int fFlag = 0;
while ((option = getopt(argc, argv, "f:")) != -1)
{
//if case 'f' print to output file
switch (option)
{
case 'f':
fFlag = 1; // flag indicates writing name to file
break;
//case f or error
case '?':
printf("error");
break;
}
}
//write to name to output file
if (fFlag)
{
FILE *file = fopen(argv[1], "w");
fprintf(file, "name");
}
}
return 0;
}
当我想将我的名字写入终端时,我的代码有效,但当我想将我的名字写入用户给定的文件时,它不起作用。代码编译并运行,但文件不存在。
命令行中的文件可能不存在。我应该在程序中创建文件吗?
我明白我做错了什么。谢谢大家!
除了评论者所说的之外,您还在使用 getopt
进行部分解析,因此其余部分应该使用它!
int main...
char *filename; /**1**/
...
case 'f':
fFlag = 1;
filename = optarg; /**2**/
....
FILE *file = fopen(filename , "w"); /**3**/
解释:f:
到 getopt
意味着 getopt
将尝试找到与 f
一起出现的选项。在 getopt
循环中,案例 'f'
,该选项被放入变量 optarg
中。至少对于 GNU getopt,这是指向 argv
的指针,因此您不必复制它。您可以将其指针值(在上面的 *2*
处)存储到您为此目的创建的变量中(*1*
)。然后您可以打开该特定文件,而不管它在 argv
(*3*
) 中的位置。请参阅 GNU getopt example 中选项 c
的处理。
编辑 你没有显示你正在使用的命令行,但我猜它类似于
./foo -f my-output-file.txt
— 在这种情况下 argv[1]
是 -f
并且 argv
[2]
是 my-output-file.txt
。 (argv[0]
是您的可执行文件的名称。)因此 fopen(argv[1], ...)
不是您想要的 ;) .