2016-05-08 11 views
0

私は現在Cを学習しており、問題を解決しようとしています。私は、次の持つテキストファイル名elements.txtあります単一のソースファイルから複数のファイルを作成する

elements.txt

Carbon (from Latin: carbo "coal") is a chemical element .. 

Oxygen is a chemical element with symbol O .. 

Platinum is a chemical element with symbol Pt ... 

Silicon is a chemical element with symbol Si ... 

Titanium is a chemical element with symbol Ti ... 
を、私は、このような carbon.txtoxygen.txtplatinum.txtsilicon.txttitanium.txtからなどの要素に基づいて、複数のファイルを作成したい

elements.txt

これは私のsoureコードです:私は私のファイルが作成されますんが、酸素がプラチナとプラチナで印刷されます

void magic(){ 
    FILE *fp,*fp1, *fp2, *fp3, *fp4, *fp5; 
    char *fn, *fn1, *fn2, *fn3, *fn4, *fn5; 
    int ch; 

    fn1 = "new/carbon.txt"; 
    fn2 = "new/oxygen.txt"; 
    fn3 = "new/platinum.txt"; 
    fn4 = "new/silicon.txt"; 
    fn5 = "new/titanium.txt"; 

    fn = "elements.txt"; 

    // Read file 
    fp = fopen(fn ,"r"); 
    if(fp == NULL){ 
    printf("Error opening %s for reading. Program terminated",fn); 
    } 

    // Write file 
    fp1 = fopen(fn1, "w"); 
    fp2 = fopen(fn2, "w"); 
    fp3 = fopen(fn3, "w"); 
    fp4 = fopen(fn4, "w"); 
    fp5 = fopen(fn5, "w"); 

    if(fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL || fp5 == NULL){ 
    printf("Error opening %s for wrting. Program terminated",fn); 
    } 

    while((ch= fgetc(fp)) != '\n') 
    fputc(ch, fp1); 

    while((ch= fgetc(fp)) != '\n') 
    fputc(ch, fp2); 

    while((ch= fgetc(fp)) != '\n') 
    fputc(ch, fp3); 

    while((ch= fgetc(fp)) != '\n') 
    fputc(ch, fp4); 

    while((ch= fgetc(fp)) != EOF) 
    fputc(ch, fp5); 

    printf("All files were created successfuly!.\n"); 
    fclose(fp1); 
    fclose(fp2); 
    fclose(fp3); 
    fclose(fp4); 
    fclose(fp5); 
    fclose(fp); 
} 



    int main(){ 
    magic(); 
    return 0; 
    } 

、シリコンとチタンはチタンで印刷されます。文字を読んでいる間にループをしているときに間違いがあるようです。この問題を解決する方法が不明です。複数のファイルを読み込み、for-loopを使用して複数のファイルを書き込む方法はありますか?あなたの.txt入力ファイルで

任意の助けをいただければ幸いです!ありがとう

+2

"プログラムが終了しました"プログラムが横になっています... – MikeCAT

+0

入力の空白行を正しく扱います。 – MikeCAT

答えて

1

、異なる要素のための内容が2つの改行文字ではなく、1で分離されています。それを書き換えてみます

Carbon is... 
Oxygen is... 

など(段落の最後に余分な改行なし)。

また、1ではなく2つの改行の有無を確認できますが、これはもっと複雑になります。

(解説:プログラムがfn1炭素について書いて、その後、fn2に改行やスイッチを見て、は、fn3に別の改行とスイッチを見て、同じことは、酸素、段落の最後に起こります)。

2

コメントが示唆するように、このブロックは正しいようにするために、あなたはreturnステートメントを追加する必要があります

if(fp1 == NULL || fp2 == NULL || fp3 == NULL || fp4 == NULL || fp5 == NULL){ 
    printf("Error opening %s for wrting. Program leaving",fn); 
    return; //add this statement to leave function 
    } 

そうでない場合は、声明プログラムはが嘘になります終了しました。

入力ファイルを変更するのではなく、空白だけの行を持つ入力ファイルをコードで処理する場合は、その行を出力ファイルに入れる前に空白だけの行を追加します。 fgets()strstr()およびstrlen()を使用すると、このようなテストを作成するのに適しています。

+0

もっと適切なのは 'exit(1)'かこれに類するもので、オペレーティングシステムの終了コードが0以外であることを示します。 – hyst329

+1

@ hyst329 - 'return'は、呼び出し関数から他のものを実行できるようにします。この場合、 'main()'はすぐ次のステップで終了しますが、必ずしもそうであるとは限りません。 – ryyker

+0

に変更するか、 'magic()'の型を 'int'に変更してから' return 1; 'に変更してください。 'void()'戻り値の型は、main()に何の情報も提供しないのでここではあまり良くありません。 – hyst329

関連する問題