如何从命令行定义文件名并将其传递给fopen()?

我有以下程序将用户的输入写入文件。 目前要写入的文件是预定义的; 但是,我希望允许用户从命令提示符定义文件名。 添加此function的最佳方法是什么? 我无法理解如何将用户输入的字符串作为fopen()函数中的参数。 我应该使用scanf()还是创建另一个getchar()while循环将chars存储在一个数组中,然后创建一个变量作为fopen()的参数或什么?

#include  int main() { char c; FILE *fp; fp = fopen("file.txt", "w"); while ((c = getchar()) != EOF) { putc(c, fp); } return 0; } 

这就是主要的论点:

 #include  int main(int argc, char **argv) { char c; FILE *fp; if (argc >= 2) fp = fopen(argv[1], "w"); else fp = fopen("file.txt", "w"); while ((c = getchar()) != EOF) { putc(c, fp); } return 0; } 

如果你遵循这个,你可能想知道argv[0] 。 这就是程序名称的位置。 某些操作系统环境将可执行文件的完整路径放在那里。 其他人只放了程序名。 其他人仍然把打字输入。

对于命令../../bin/someprogram

在Windows上, argv[0]"C:\\Documents and Settings\\User\bin\\someprogram.exe"
在Linux / bash上, argv[0]../../bin/someprogram
在Ultrix / csh上,(我认为) argv[0]/home/username/bin/someprogram

使用argc和argv

 #include  int main(int argc, char **argv) { char c; FILE *fp; if(argc < 2){ printf("Usage : ./a.out "); exit(0); } fp = fopen(argv[1], "w"); while ((c = getchar()) != EOF) { putc(c, fp); } return 0; } 

像这样定义main:

 int main(int argc, char *argv[]) { 

然后使用argv:命令行参数的数组。 argv [0]是在命令行输入的命令的名称,argv [1]是第一个参数。

  fp = fopen(argv[1], "w'); 

您可能想要检查argc> 1以避免超出范围的数组访问。

有许多函数可以读取字符串; 例如, fgetsscanf 。 问题是你需要知道你想要在之前阅读的最大字符数。 如果这对您没问题,请使用其中之一。 如果没有,那么你必须编写自己的函数来读取动态字符串, 就像这里一样 。