2017-03-28 12 views
0

ユーザー入力からファイルを開こうとすると問題が発生しました。最初に入力したときにファイル名が正しい場合は開くことができますが、whileループで正しい場合はできません。C - ユーザー入力ファイル名を使用

char file[256], *end; 
printf("Enter the name of the file: "); 
fgets(file, 256, stdin); 
if((end=strchr(file, '\n'))!=NULL) 
    *end='\0'; 
FILE *fp=fopen(file, "r"); 
while(fp==NULL) 
{ 
    printf("The given file doesn't exist. Enter a file name: "); 
    fgets(file, 256, stdin); 
    if((end=strchr(file, '\n'))!=NULL) 
     *end='\0'; 
    FILE *fp=fopen(file, "r"); 
} 
+0

ファイルが終了しないと終了します。なぜ繰り返し聞いてみたいのですか?指定されたファイルは存在しません。ファイル名を入力してください: '?? – LethalProgrammer

+0

@xingありがとうございました。解決しました:D –

答えて

0

のために、私はそれを開くことができ

チェックそれが初めて入力されたときに、whileループで正しいかどうかは判断できません。

いいえ、あなたはだまされています。問題は、ループの状態がwhile(fp==NULL)で、変数fpの外側にあるとテストします。ループ内ではというループがありません。ループ内にはその変数は決して設定されないので、ループを入力すると終了しません。

ただし、2回目以降の試行でファイルを開くことに失敗したわけではありません。ループの内部でを別の変数fpと宣言し、外部に「シャドーイング」してfopen()の結果を割り当てます。このfopen()が成功すると、効果は無視されます。

もう1つ、今や削除されていると答えました。主なやり方はループを修正して、外部で使用されている同じfpを使用することです。それがループのこのバージョンをもたらすであろう実現最小の変更:

while(fp==NULL) 
{ 
    printf("The given file doesn't exist. Enter a file name: "); 
    fgets(file, 256, stdin); 
    if((end=strchr(file, '\n'))!=NULL) 
     *end='\0'; 
    fp=fopen(file, "r"); 
} 

方法あなたが入力したファイル名を、両方が存在し、コード内の先行するといくつかの他の問題だけでなく、いくつかの不要なコードの重複があります。しかし、ユーザーが入力したファイル名がシンプルで短ければ、そのトリックが行われます。

0

ここではプラットフォームについて考慮する必要があります。コードをクロスプラットフォームのファイルにするには、アプローチが異なることを確認してください。プラットフォームが重要でない場合、Windowsについて心配する必要はなく、Linuxではstat utilityを使用できます。

ファイルの存在をチェックする簡単な方法(読み取りモードでのチェック):ファイル名が正しい場合は、このリンクは、より多くの情報についてC file check.

+0

ファイルを開こうとするのとは別にファイルが存在するかどうかをチェックする方が良いのはなぜですか?ファイルの存在のみをチェックしたい場合は、存在するような関数が意味をなさないかもしれませんが、ファイルが存在する場合には(再)ファイルを開く場合は不必要です。 –

+0

OPのprintfから、_fileは存在しません_ので、彼はファイルの存在チェックをしたいと思っています。そのため、別の機能でファイルの存在を確認することが非常に効率的だと思ったのです。 – LethalProgrammer

+0

OPはすぐに「ユーザー入力からファイルを開こうとすると問題に遭遇しました」と言っているので、ファイルを開こうとしているとは思えません。彼がそれを開けたら、彼がやりたいことの何も提示しないということは*良い*です。私たちはその質問に対処するためにそれを見る必要はありません。 –

関連する問題