调用程序时,我将.txt文件的名称作为参数解析到命令行中。我想将.txt文件的名称分配给char变量。
这是我的尝试:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv[])
{
int i;
for (i=0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
FILE *fPointer;
if ((fPointer = fopen("exampleWheel.txt", "r")) == NULL) {
fprintf(stderr, "can't open file");
exit(1);
}
return 0;
}
在第11行中,我想将字符串“ exampleWheel.txt”替换为argv [1]的值,以便我可以打开任何.txt文件。
请告诉我如何将其应用于现有代码。
提前谢谢您:)
您的最初问题在这里:
int main(int argc, char **argv[])
{
char **argv[]
为错误。它是char *argv[]
或char **argv
argv
您的间接寻址级别太多。参见:C11 Standard - §5.1.2.2.1 Program startup(p1)。您的编译器应向您发出警告...
您确实启用了警告吗? gcc / clang的-Wall -Wextra -pedantic
或VS的/W3
。我怀疑在修复main
的调用并进行所需的替换后,所有替换都将正常工作。
由于您希望将文件名作为参数传递给main()
(这是正确的方法),因此您还需要确保用户在将argv[1]
传递给fopen
之前提供所有必需的参数。您可以通过简单的if (argc < 2)
检查来执行此操作,以检查是否为程序提供了至少2个参数。
合并支票,您可以这样做:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fPointer;
if (argc < 2) { /* validate required arguments provided */
fprintf (stderr, "error: insufficient input.\n"
"usage: %s <filename>\n", argv[0]);
return 1;
}
if ((fPointer = fopen (argv[1], "r")) == NULL) {
perror("fopen-argv[1]"); /* a fopen failure sets errno, use perror */
exit (EXIT_FAILURE);
}
return 0;
}
以上注意,在失败时,fopen
功能会设置errno
,这使您可以使用perror()
功能输出系统错误。您可以在fprintf
消息之外或代替它使用该消息。当包含stdlib.h
时,便具有为EXIT_SUCCESS
(值为0
)和EXIT_FAILURE
(值为1
)定义的系统宏,可以使用而不是对exit(1);
进行硬编码。由您决定。
在fopen
呼叫中,将"exampleWheel.txt"
更改为argv[1]
。
这里有一个实用的例子。您需要跳过argv [0],因为它包含实际的程序调用命令。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i;
char filename[100], c;
for (i=1; i < argc; i++){
FILE *fPointer = fopen(argv[i], "r");
if (fPointer == NULL) {
fprintf(stderr, "can't open file");
exit(1);
}
// Read contents from file
c = fgetc(fPointer);
while (c != EOF)
{
printf ("%c", c);
c = fgetc(fPointer);
}
printf ("\n");
fclose(fPointer);
}
return 0;
}
我希望它会有所帮助! 😃