2016-10-10 4 views
1

このプログラムでは、端末またはユーザが指定した出力ファイル()に自分の名前を書き込むことになっています。私は端末に私の名前を書きたいときプログラムがコマンドラインで指定された名前を使用してファイルを作成していません

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    // no output file print to screen, print name to terminal 
    if (argc < 2) 
    { 
     fprintf(stdout, "name\n"); 
    } 
    //print name to output file given by user 
    else 
    { 
     int option; 
     int fFlag = 0; 
     while ((option = getopt(argc, argv, "f:")) != -1) 
     { 
      //if case 'f' print to output file 
      switch (option) 
      { 
       case 'f': 
        fFlag = 1; // flag indicates writing name to file 
        break; 
        //case f or error 
       case '?': 
        printf("error"); 
        break; 
      } 
     } 
     //write to name to output file 
     if (fFlag) 
     { 
      FILE *file = fopen(argv[1], "w"); 
      fprintf(file, "name"); 
     } 
    } 
    return 0; 
} 

私のコードは動作しますが、私は、ユーザーが指定したファイルに自分の名前を書きたいときには動作しません。コードはコンパイルされ実行されますが、ファイルは存在しません。

コマンドラインのファイルが存在しない可能性があります。プログラムでファイルを作成するはずですか?

私は間違っていることを理解しています。みんなありがとう!

+0

書き込みアクセスのために開こうとしているファイル名が 'argv [1]'に入っていることを確認しましたか?(b) 'file'が書き込みを試みる前にNULLでないことを確認し、 (c)両方のファイルが展開されていると仮定して、あなたのプログラムが実行されている現在の作業ディレクトリ*があなたが作成しようとしたファイルを確立していることを確認してください。今のところ、(a)と(b)は潜在的な候補者に見えますが、後者は[スペンサーの第六戒則](http://www.seebs.net/c/10com.html)に違反する主要な例です – WhozCraig

+0

再フォーマットされたコードでは、 'fprintf(file、" name ");'は 'argc <2'の場合のみです。 – chux

+0

前のコメントに加えて、書いた後にfclose(ファイル)を忘れたと思います。 –

答えて

4

コメント者が言ったことに加えて、あなたの解析の一部としてgetoptを使用しているので、残りの部分を使用する必要があります。

int main... 
char *filename; /**1**/ 
... 
    case 'f': 
    fFlag = 1; 
    filename = optarg; /**2**/ 
.... 
    FILE *file = fopen(filename , "w"); /**3**/ 

説明:getoptからf:getoptfと一緒に行くのオプションを見つけようとしていることを意味します。 getoptループでは、ケース'f'で、そのオプションは変数optargに入れられます。少なくともGNU getoptでは、それはargvへのポインタなので、コピーする必要はありません。その目的のために作成した変数(*1*)にポインタ値(上記の*2*)を隠すことができます。その後、そのファイルがどこにあるかに関係なく、そのファイルを開くことができます。argv*3*)。 GNU getopt exampleのオプションcの処理を参照してください。

編集あなたが使用しているコマンドラインを示していないが、私はそれがargv[1]-fargv[2]my-output-file.txtである場合には

./foo -f my-output-file.txt 

—のようなものだ推測しています。 (はあなたの実行ファイルの名前です)したがって、fopen(argv[1], ...)はあなたが望むものではありません。

+0

ご協力いただきありがとうございます!私はそれを働かせた。 – name

関連する問題