从C中的命令行参数打开文件

时间:2012-02-26 00:04:05

标签: c fopen

我希望我的C程序要求用户键入要打开的文件的名称,并将该文件的内容打印到屏幕上。我正在使用C教程,到目前为止已经有了以下代码。但是当我执行它时,它实际上不允许我输入文件名。 (我按'按任意按钮继续',我正在使用代码块)

我在这里做错了什么?

#include <stdio.h>

int main ( int argc, char *argv[] )
{
    printf("Enter the file name: \n");
    //scanf
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s filename", argv[0] );
    }
    else
    {
        // We assume argv[1] is a filename to open
        FILE *file = fopen( argv[1], "r" );

        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else
        {
            int x;
            /* Read one character at a time from file, stopping at EOF, which
               indicates the end of the file. Note that the idiom of "assign
               to a variable, check the value" used below works because
               the assignment statement evaluates to the value assigned. */
            while  ( ( x = fgetc( file ) ) != EOF )
            {
                printf( "%c", x );
            }
            fclose( file );
        }
    }
    return 0;
}

4 个答案:

答案 0 :(得分:5)

这将从stdin读取文件名。如果文件名不作为命令行的一部分提供,也许你只想这样做。

int main ( int argc, char *argv[] ) 
{ 
    char filename[100];
    printf("Enter the file name: \n"); 
    scanf("%s", filename);

    ...
    FILE *file = fopen( filename, "r" );  

答案 1 :(得分:4)

如果要从提示中读取用户输入,可以使用scanf()功能。要解析命令行参数,可以在命令行中键入它们,如:

myprogram myfilename

而不仅仅是输入

myprogram

并期待被提示。程序启动时myfilename将在argv数组中。

因此,首先删除printf( "Enter the file name:" )提示符。假设您在命令行argv[ 1 ]之后将其作为第一个参数输入,则文件名将在myprogram中。

答案 2 :(得分:4)

您正在将命令行参数与用户输入混合在一起。

使用命令行参数时,执行程序并同时传递参数。例如:

ShowContents MyFile.txt

相反,当您阅读用户输入时,首先执行程序,然后提供文件名:

ShowContents
Enter the file name: MyFile.Ttxt

您的程序已经读取了第一个参数argv[1]并将其视为要打开的文件的名称。要让程序读取用户输入,请执行以下操作:

char str[50] = {0};
scanf("Enter file name:%s", str); 

然后文件名将位于str,而不是argv[1]

答案 3 :(得分:2)

这是因为您的IDE没有将filename参数传递给您的程序。看一下这个question on stackoverflow