2017-02-10 3 views
2

テキストファイルをバイナリファイルに変換するコードを記述しています。この特定の例では、最初の名前を表示しないという事実を除いて、エラーは返されず正常に実行されます。私の入力ファイルにはjohn doe 1 4.0が含まれています。予想される出力は[email protected]ですが、出力は[email protected]です。私はfseekを使ってオフセットを移動しようとしました。私はファイルを別々に閉じようとしました。変数の名前を変更してif文を変更しようとしました。fscanf()入力ファイルからすべてのコンテンツの一部だけを書き出しません

私は完全にはわかりませんが、エラーがループの可能性があると感じています。 firstNameとlastNameを入れ替えても、同じことが起こりますが、逆になります。つまり、fwriteを使用して最初に読み込まれたものは、私のコードで省略します。これが起こるように私のコードに何が間違っていますか?

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

void textToBinary(char *inputFile, char *outputFile){ 

    FILE *ifp, *ofp; 

    char firstName[256], lastName[256]; 
    int sID; 
    float gpa; 

    unsigned char firstNameLen = strlen(firstName); 
    unsigned char lastNameLen = strlen(lastName); 

    if(((ifp = fopen(inputFile, "r")) != NULL)&&((ofp = fopen(outputFile, "w")) != NULL)){ 
     while((fscanf(ifp, "%s %s %d %f\n", firstName, lastName, &sID, &gpa)) != EOF){ 
      fwrite(&firstNameLen, sizeof(firstNameLen), 1, ofp); 
      fwrite(firstName, sizeof(char), firstNameLen, ofp); 
      fwrite(&lastNameLen, sizeof(lastNameLen), 1, ofp); 
      fwrite(lastName, sizeof(char), lastNameLen, ofp); 
      fwrite(&sID, sizeof(int), 1, ofp); 
      fwrite(&gpa, sizeof(float), 1, ofp); 
     } 
     fclose(ifp); 
     fclose(ofp); 
    }else{ 
     fprintf(stderr, "Couldn't open: %s\n", ifp); 
    } 
} 
+3

を使用してコードの再書き込みを推奨しました。これらはループ内に属します。 – Gene

+2

あなたの 'fscanf()'チェックは '!= EOF'ではなく' == 4'でなければなりません。 EOFだけでなく、数字0,1,2、または3が得られ、すべてが問題を示している可能性があります。 –

+0

'char firstName [256]、... unsigned char firstNameLen = strlen(firstName);'はUB – chux

答えて

1

はあなたがゴミバッファ値に `firstNameLen`と` lastNameLen`を計算している上記のコメント

//unsigned char firstNameLen = strlen(firstName); 
//unsigned char lastNameLen = strlen(lastName); 

if(((ifp = fopen(inputFile, "r")) != NULL)&&((ofp = fopen(outputFile, "w")) != NULL)){ 
    while((fscanf(ifp, "%255s %255s %d %f", firstName, lastName, &sID, &gpa)) == 4){ 
     unsigned char firstNameLen = strlen(firstName); 
     unsigned char lastNameLen = strlen(lastName); 
     fwrite(&firstNameLen, sizeof firstNameLen, 1, ofp); 
     fwrite(firstName, sizeof *firstName, firstNameLen, ofp); 
     fwrite(&lastNameLen, sizeof lastNameLen, 1, ofp); 
     fwrite(lastName, sizeof *lastName, lastNameLen, ofp); 
     fwrite(&sID, sizeof sID, 1, ofp); 
     fwrite(&gpa, sizeof gpa, 1, ofp); 
    } 
    fclose(ifp); 
    fclose(ofp); 
}else{ 
+0

変数型宣言はループ内にあってはいけません。 –

+1

@JoeDF:どういう意味ですか?現在のC(C99以降)では、ステートメントブロック内の任意のポイントで変数を宣言することができます。ステートメントブロックの先頭にある必要はありません。 –

+0

@JoeDFこれは単なるプログラミングスタイルです。これには何も問題ありません。 – RoadRunner

関連する問題