0

getc()関数を使用して、あるファイルの内容を別のファイルにコピーしようとしています。しかし、次のプログラムの出力は大量のゴミであるため、不明な論理エラーが発生しています。

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

int main()
{
    FILE *f; 
    FILE *write;
    f = fopen("nums.csv","r");
    write = fopen("numsWrite.dat","w");

    char tempChar;

    int i;
    for(i = 0; (tempChar = getc(f)) != EOF; i++)
    {
        tempChar = getc(f);
        fprintf(write,"%c",tempChar);
    }
    fprintf(write,"\n");

    fclose(f);
    fclose(write);

    return 0;
}

nums.csvの内容は次のとおりです。

1256,2548,35151,15,56,38

プログラムは以下を返します:

2624,55,55,8
4

2 に答える 2

2

コードにはいくつかの問題があります。

int main()する必要がありint main(void)ます; これは、ほぼ確実に何も害を及ぼさない小さな問題ですが、後者の方が正しいです。

fopen()呼び出しが成功したかどうかはチェックしません。

読んだ文字を数えるために使用iしていますが、その値で何もしません。

このgetc()関数はタイプの結果を返すintので、必ず。を作成tempCharする必要がありintます。charこれは、有効な文字値(オブジェクトに収まる)またはEOF通常はである値のいずれかを返すことができるためです-1getc()の結果をcharオブジェクトに格納することにより、EOF(プレーンが符号なしの場合)表示されないか、有効な入力文字charと区別できなくなります。EOF

Razvanの回答に対するコメントで、テストをに変更したとのことですtempChar != EOF。上で説明した問題は別として、ループの最初の反復ではtempChar初期化されておらず、比較の結果は予測できません。

を使用して入力ループを作成する従来の方法getc()は次のとおりです。

int c;
while ((c = getc(f)) != EOF) {
    /* do something with c */
}

スタイルの問題として、writeはあまり良い名前ではありませんFILE*。一つには、その名前の関数があります(CではなくPOSIXによって定義されていますが、それでも混乱を招く可能性があります)。FILE*代わりに、オブジェクトinを呼び出すことができますout

于 2012-07-07T22:31:38.967 に答える
0

getcを2回呼び出します。1回はfor条件で、もう1回はforbodyで呼び出します。次の行を削除します。tempChar=getc(f); そしてさらに試みる。

于 2012-07-07T22:19:59.293 に答える