web-dev-qa-db-ja.com

Cのコマンドライン引数からファイルを開く

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;
}
6
TylarBen

プロンプトからユーザー入力を読み取りたい場合は、scanf()関数を使用します。コマンドラインパラメータを解析するには、次のようにコマンドラインで入力します。

_myprogram myfilename
_

入力するだけでなく

_myprogram
_

プロンプトが表示されることを期待しています。 myfilenameは、プログラムの起動時にargv配列に含まれます。

したがって、printf( "Enter the file name:" )プロンプトを削除することから始めます。コマンドラインでmyprogramの後に最初のパラメーターとして入力したとすると、ファイル名は_argv[ 1 ]_になります。

4
Bob Kaufman

これは、stdinからファイル名を読み取ります。おそらく、ファイル名がコマンドラインの一部として指定されていない場合にのみこれを実行する必要があります。

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

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

コマンドライン引数とユーザー入力を混同しています。

コマンドライン引数を使用する場合は、プログラムを実行すると同時に引数を渡します。例えば:

ShowContents MyFile.txt

対照的に、ユーザー入力を読み取るときは、最初にプログラムを実行してから、ファイル名を指定します。

ShowContents
Enter the file name: MyFile.Ttxt

プログラムはすでに最初の引数argv[1]を読み取り、それを開くファイルの名前として扱います。プログラムにユーザー入力を読み取らせるには、次のようにします。

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

その場合、ファイル名はargv[1]ではなくstrになります。

4
Diego

これは、IDEがファイル名引数をプログラムに渡していないためです。これを見てください stackoverflowに関する質問

2
tfmoraes