0

私は C に基づいていくつかの質問をしようとしていましたが、この特定の問題に行き詰まりました。ここで私によると、old.outファイルは、fprintfが入力をファイルポインターに割り当てるため、scanfで入力したものをすべて書き込む必要がありますが、驚いたことに、後でwhileループがあるため、old.outに何も書き込まれていないことがわかりました実行されません。これはどのように起こっていますか?fprintf 関数の私の誤解と関係がありますか? 以下のコードを貼り付けました。

#include<stdio.h>
main()
{
    FILE *fp;
    char a;
    fp=fopen("old.out","w");
    if(fp==0)
        printf("File opening error");
    else
    {
        for(scanf("%c",&a);a!=EOF;scanf("%c",&a))
            fprintf(fp,"%c",a);
        fclose(fp);
        fp=fopen("old.out","r");
        while(!feof(fp))
            putchar(getc(fp));
    }
    return 0;
}
4

2 に答える 2

6

scanf()EOF読み取る文字がなくなった場合、引数を に設定しません。したがって、forループは無限ループです。変更する 2 つの点:

  1. 仮定をする代わりに、ドキュメントを読んでください。

  2. fgets()の代わりに使用しscanf()ます。(scanf()結局のところ、あなたが思っているようなことはしないということは忘れてください。特に初心者にとっては、はるかに優れたフレンドリーな機能がたくさんあります。)


「わかった、わかった、でもコーデックスをハズしてもいい?」

あなたはできる:

#include <stdio.h>
#include <limits.h>
#include <assert.h>

int main()
{
    char buf[LINE_MAX];
    fgets(buf, sizeof(buf), stdin);

    FILE *fp = fopen("old.out", "w");
    assert(fp);
    fputs(buf, fp);
    fclose(fp);

    fp = fopen("old.out", "r");
    assert(fp);
    if (fgets(buf, sizeof(buf), fp))
        puts(buf);
    fclose(fp); 

    return 0;
}
于 2013-06-28T07:35:32.523 に答える
3

かなり問題があります。

1つは、を割り当てscanf()ず、 *return * します。また、 a (値です)には入らないので危険です。また、I/O を行う前に確認することはお勧めできません。 EOFEOFEOFcharinta != EOFfeof()

于 2013-06-28T07:35:59.760 に答える