4

プログラムは常に終了します。私はこの問題に頻繁に遭遇しているようで、以前に何らかの方法で修正したと思いますが、どうすればよいかわかりません。ファイルを作成しないのはなぜですか?

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

int main (void){
    FILE *fp;
    int c;

    char file_w[100];
    char string[100];
    printf("Enter filename\n");
    fgets(file_w, 100, stdin);
    fp = fopen(file_w, "w");
    if (fp == NULL){
        printf("Can't open file\n");
        exit(0);
    }   
    printf("Enter a string");
    fgets(string, 100, stdin);
    for(c = 0; c <= sizeof(string); c++)
    {
        fprintf(fp, "%s\n", string);
    }

    printf("file written");
    fclose(fp);
    return 0;
}
4

5 に答える 5

2

入力したファイルの名前を出力してみてください:

printf("%s\n", file_w);

file_w を取得する行の直後に、必要なものを確実に入力してください。端末の構成が間違っている可能性があるのと同じケースです。

コンピューターが Linux または Unix の場合は、絶対パス名を入力してみてください。

/tmp/newfile.txt

コンピューターが Windows の場合... C:\temp\ が存在する (または作成する) かどうかを確認してから、次のように入力します。

C:\temp\newfile.txt

いずれにせよ、ファイル名だけでなく、絶対パスを指定できることに注意してください。そのため、ファイルが書き込まれるディレクトリに書き込む権利 (つまり、パーミッション) があるかどうかを再確認してください。

エラーをチェックし、問題のより良い説明が必要な場合は、コードの代わりに次の行を fopen のすぐ下に使用してみてください。

  if( fp == NULL ) {
        // Error, as expected.
        perror( "Error opening file" );
        printf( "Error code opening file: %d\n", errno );
        printf( "Error opening file: %s\n", strerror( errno ) );
        exit(-1);
  }

エラー コードの代わりに問題の説明を返すという理由だけで、strerror は素晴らしい関数です。

于 2012-12-21T08:59:49.023 に答える
1

問題は「fgets()からの実際の名前の後に見えない文字」にあると思います。プログラミングに関しては、「問題を解決するのに苦労する」ことは学習プロセスの一部であるため、その文字が何であるか、どこから来て、どのように修正するかを正確に理解させます. 簡単にできれば、誰でもできます。

于 2012-12-21T09:33:40.380 に答える
0

の戻り値fopenがNULLの場合、エラーが発生したことを意味します。errnoグローバルを調べて、ファイルを開かない理由をデバッグするために発生したエラーを確認することをお勧めします。

wフラグは次のことを行います。

書き込み:出力操作用の空のファイルを作成します。同じ名前のファイルがすでに存在する場合、その内容は破棄され、ファイルは新しい空のファイルとして扱われます。

したがって、ファイルが存在しない場合はファイルを作成する必要があります。存在する場合は、その内容を上書きします。

それができない場合は、別の問題がありますが、あなたが提供した小さな情報から、それが何であるかを判断するのは難しいです。

于 2012-12-21T08:48:59.063 に答える