2011-12-10 15 views
0

以下の問題の主な説明です。私はOUTFは、既存のファイルへのファイルポインタであるファイルポインタを理解するのに苦労していますか?

if (outf!=NULL){ 
    printf("Output file already exists, overwrite (y/n):"); 
    scanf("%c",yn); 
} 

を求めた後、エラーメッセージを取得する理由はなく、単に、私が把握することはできません。コードの途中で説明を読んでください。

#include <stdio.h> 
#include <stdlib.h> 
#include <float.h> 
#include <string.h> 

int main() { 

/* Declare file pointer */ 
    FILE *inf; 
    FILE *outf; 

    int linenumber,linecounter=0,linepresent; 
    char filename[21]; 
    char detail[21]; 
    char linedetail[21]; 
    char outfilename[21]; 
    char letter,yn='y'; 
    int position; 

/*INPUT DETAILS Ask user for file name and line number*/ 

    printf("Please enter an input filename and a linenumber: "); 
//scan filename to char string and line number to int variable 
    scanf("%s %i",&filename,&linenumber); 

/*OUTPUT DETAILS Ask user for file name, letter & position, etc*/ 
    printf("Please enter an output filename, a letter and a position:");  
    scanf("%s %c %i",&outfilename,&letter,&position); 

/* Open file for reading */ 
    inf=fopen (filename,"r"); 
    outf=fopen(outfilename,"r"); 
/*check that file exists*/ 
    if (inf!=NULL) { 

これまですべて正常に動作します。 次に、outfファイルがすでに存在するかどうかを調べます。 outfが既存のファイルを指している場合、「出力ファイルはすでに存在し、上書きされています(y/n):」というメッセージが表示されます。

ただし、これを印刷するとエラーウィンドウが開きます!これはおそらく非常に新人のミスです - 私はまだCを学んでいます。そのようなファイルがない場合、プログラムは正常に完了し、if文をバイパスします。

 if (outf!=NULL){ 
      printf("Output file already exists, overwrite (y/n):"); 
      scanf("%c",yn); 
     } 
     if (yn=='y'){ 
    /*keep reading to end of file*/ 
      while (feof(inf)==0) { 
       linecounter++; 
    /*read each line and store the line number in detail[WORDS GO HERE]*/ 
       fscanf (inf,"%s", &detail); 
    /*If we reach the line selected by the user*/ 
       if (linecounter==linenumber){ 
        strcpy(linedetail,detail); 
        linepresent=1; 
       } 
      } 
      if (linepresent==0) { 
       printf("File only contains %i lines",linecounter); 
      } 
     } else { 
      exit(1); 
     } 
    } else { 
     printf("Input file not found"); 
    } 

printf("%s",linedetail); 

/* close the file */ 

    fclose(inf); 
    fclose(outf); 

    return (0); 

} 
+1

'&': 'scanf("%c "、&yn)' – pmg

+1

あなたが怒っている行を見つけたら、なぜ単純に 'int main ){char yn = 'y'; scanf( "%c"、yn); 0を返します。 } '...そして、それがちょうどそれを墜落させたとき? : -/*(次回は、質問を最小限のケースに減らして、他のすべてのものを取り除いたときにエラーを発生させるときには最善の方法です。)* – HostileFork

+0

ありがとう、私は質問のテクニックを洗練する必要があります! everyonesの忍耐のための歓声! – user1083734

答えて

3

まず、すでに問題を述べた:あなたは、読み取りモードでは、出力ファイルを開いています。書き込みのためにそれを開くには:

また
outf=fopen(outfilename,"w"); /* Note the "w". */ 

を、scanf関数は、()の変数ではなく、その値へのポインタを受け入れ、あなたがscanf("%c", yn);を書く場合、あなたはナンセンスであるポインタとして文字yのscanfなります。あなたはこのようにする必要があります:scanf("%c", &yn);

しかし、これらを修正しても、プログラムは期待どおりに動作しません。書き込みのために開こうとしているファイルが存在しない場合、fopen()はNULLを返しません。新しいファイルが作成されます。あなたのコードは常にが存在すれば出力ファイルを上書きします。 NULLはfopenがオープン/ファイルを作成します(たとえば、あなたがそれを行うための権限を持っていなかった)ことができなかった場合にのみ返され、そして、あなたはこのようにそれを処理する必要があります何elseブロックが必要とされていないことを

outf=fopen(outfilename, "w"); 
if(outf == NULL) { 
    perror("Failed to open output file: "); 
    fclose(inf); /* Don't leave files opened. It's bad form. */ 
    exit(1); 
} 
/* Open succeeded, do your stuff here. */ 

は注意ifの後には、exit()がすぐにプログラムを終了するためです。

また、「ファイルへのポインタ」のようなものはありません。 FILEは、開いているファイルを表す構造体です。

0

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

あなたは、読み取りフラグを出力ファイル開いています。それを "w"に変更してみてください。

「w」で開いたファイルに書き込むことは、古いファイルを叩くことには注意してください。 "a"を使用してファイルに追加します。

+0

OPは最初に読み込みモードでファイルを開くことでファイルが存在するかどうかを確認する予定です。 nullが返された場合、fileは存在しないとみなされます。これは常に正しいとは限りません。既存のファイルを読み取る権限がないためにnullも返される可能性があるからです。おそらくstat()ライブラリ関数が良い選択です。 – Gowtham

+0

@Gowtham:私はOPが*出力ファイル*を開くと、OPが存在しなければNULLを返すと思うと思います。もし彼が 'if'条件で変数を混乱させていない限り... – Staven

+0

@Stavenあなたが出ているところですが、出力ファイルがすでに存在するかどうかを検出しようとしています。それが存在する場合、ユーザーはそれを上書きするかどうかを選択できます。それが存在しない場合、私はfcloseして "書き込み"モードで作成しようとしていました。それが存在するかどうかを検出する際に問題があります。これについてどうすればいいですか? – user1083734

0

ynのアドレスをscanfに渡す必要があります。

scanf("%c", &yn);

関連する問題