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

C 如何从命令行定义文件名并将其传递给fopen()?,c,C,我有一个将用户输入写入文件的程序。当前要写入的文件是预定义的;但是,我希望允许用户从命令提示符定义文件名。添加此功能的最佳方式是什么?我很难理解如何将用户输入的字符串作为fopen()函数的参数。我应该使用scanf()还是创建另一个getchar(),同时循环将字符存储在数组中,然后创建一个变量作为fopen()的参数还是其他什么 #include <stdio.h> int main() { char c; FILE *fp; fp = fopen("

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

#include <stdio.h>

int main()
{
    char c;
    FILE *fp;

    fp = fopen("file.txt", "w");

    while ((c = getchar()) != EOF)
    {
        putc(c, fp);
    }

    return 0;
}
#包括
int main()
{
字符c;
文件*fp;
fp=fopen(“file.txt”,“w”);
而((c=getchar())!=EOF)
{
putc(c,fp);
}
返回0;
}
使用argc和argv

#include <stdio.h>

int main(int argc, char **argv)
{
    char c;
    FILE *fp;
if(argc < 2){
printf("Usage : ./a.out <filename>");
exit(0);
}

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

    while ((c = getchar()) != EOF)
    {
        putc(c, fp);
    }

    return 0;
}
#包括
int main(int argc,字符**argv)
{
字符c;
文件*fp;
如果(argc<2){
printf(“用法:./a.out”);
出口(0);
}
fp=fopen(argv[1],“w”);
而((c=getchar())!=EOF)
{
putc(c,fp);
}
返回0;
}

这就是main的参数的作用:

#include <stdio.h>

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;
}
#包括
int main(int argc,字符**argv)
{
字符c;
文件*fp;
如果(argc>=2)
fp=fopen(argv[1],“w”);
else fp=fopen(“file.txt”,“w”);
而((c=getchar())!=EOF)
{
putc(c,fp);
}
返回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
定义main如下:

int main(int argc, char *argv[]) {
然后使用argv:一个命令行参数数组。argv[0]是在命令行中输入的命令名,argv[1]是第一个参数

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

您可能需要检查argc>1以避免越界数组访问。

有许多函数可以在字符串中读取<例如,code>fgets和
scanf
。问题是,您需要知道在手之前要读入的最大字符数。如果这对你来说没问题,那么就使用其中一种。如果没有,则必须编写自己的函数以读取动态字符串。

如果要将所有内容压缩到初始值设定项中:
FILE*const fp=fopen(argc>=2?argv[1]:“FILE.txt”,“w”):-)@KerrekSB:这不是一个进步。处理
argc
的自然发展是处理每个参数需要更多的case,可能是case语句的fall-throughs.Hmmm。我知道,在您的程序中,输入命令提示符的字符串何时实际存储在argv[1]中?在提示符中输入命令之前是否需要键入命令?@stariz77:这发生在程序开始运行之前。@AlexanderMills:
argv[0]
包含程序名。这类似于将整个命令行放在argv数组中。