2012-01-18 8 views
1

My機能で動作していません。ファイルに書き込まれた後のtxt:関数fscanf()ファイルへの書き込み入力

1: DVD 3 The Queen //checked for excess whitespace(has newline however) 

ターミナル出力:

1: The Queen DVD 3 
medium is: DVD title is: � //title being saved inappropriately 
          @ 
2: � 
    @ DVD 3 

今、私の関数fgets関数は間違っています! のgcc -ansi -std = C89 -pedantic -Wmissing-プロトタイプ-Wall test.cのRecord.c -oテスト

:何らかの理由で、タイトルは、私は、次のフラグでコンパイルしています不適切

を保存されています

test.cのがどこにあるか私のメイン

+1

あなたのバッファにはメモリが割り当てられておらず、 'medium'です。実際には、変数を使用する前に変数を初期化することさえありません。 –

答えて

4
char * medium; 

これは、あなたが実際にあなたが所有する一部のメモリへmediumポインティングを持っていることを

char medium[SOME_CONSTANT]; // or char* medium = malloc(x); if you need the 
          // memory to persist after the function returns 

でなければなりません。今のようにポインタがガーベジを指していて、fscanfが指しているメモリに文字列を保存することを期待しています。

関数が魔法のように作成されたメモリへのポインタを返すように見える場合は、その関数が愚かなstrdupでない限り、ドキュメントを2回確認することをお勧めします。この関数は、実際にすでに割り当てられているメモリへのポインタを期待するか、またはmallocのファミリの誰かに割り当てられたメモリのブロックを指すポインタを返します。その場合、割り当てを解除する必要があります。 (それはfscanfするためのものであるように返される文字列は、予測できないサイズである場合に特に)ごくまれに

は、関数は、その中及びmalloc Dを有することなく、事前に割り当てられたバッファを取ることなく、メモリへのポインタを戻します。

+0

以下を含むようにコードを変更しました: – Layla

+0

@LeilaHejazi申し訳ありませんが、私はあなたが書いたものを見ることができません。 –

+0

このチェックを!= 3に変更し、 'char medium [7]'を変更しましたが、何らかの理由で私の "title"ストリングが正しく読み込まれていません.... '1:The Queen DVD 3 medium is: :(ヌル)2:(ヌル)DVD 3 ' – Layla

2

あなたはメディア用のバッファに割り当てられていませんでした:

char * medium; 

ちょうどあなたがに読み込むために、任意のメモリ空間を予約していませんでした媒質と呼ばれるのcharへのポインタを作成します。

medium = malloc(256); 

それとも、スタック上に割り当てることができます:

char medium[256]; 

あなたは、私が希望抱えている問題を考えるとこれはメディアのために(あなたは256文字まで読み取ることができるように)256のバイトを割り当てますスタック上の割り当てを使用して、構造体をファイルに読み書きすることをお勧めします。ディスク領域を犠牲にしてフィールドを解析する必要がなくなります(空白文字をたくさん書くことになります)が、この浪費このシナリオでは無視できる。

fwrite(t, sizeof(Record_t), 1, pFile); 
fread(t, sizeof(Record_t), 1, pFile); 
+0

はい私はそれを 'char medium [APPROPRIATE SIZE]'に変更しました。媒体は正しく読み込まれましたが、それ以外のものはすべて読み込まれました。それはそれにヌルを読み込まない。 != 3に変更して 'char medium [7]'を変更しましたが、何らかの理由で私の "title"文字列が正しく読み込まれていません.... '1:The Queen DVD 3 medium is :DVDタイトル:(null)2:(null)DVD 3 ' – Layla

+0

タイトル用のバッファも設定しましたか?あなたのコードではまだ初期化されていないポインタですが、それはクラッシュしないかもしれません(ポインタがどこにあるかに依存します)が、あなたが望むものではありません! –

+0

はい私はしました!私はそれを適切な大きさにしましたが、私がそれをしたときにはちょうど私に迷惑をかけました..... " @ 'のように – Layla

1

いくつかの方法:

  1. それがに文字列を読むことあなたがスペースを割り当てられていませんでした。次のものが必要です。

    char medium[100]; 
    
  2. をあなたが適切にエラーをチェックしません:

    if (!(fscanf(infile,"%d: %s %d", &ID, medium, &rating) 
    

    する必要があります:あなたが明示的にあなたが期待されるすべての値を得たことをテストする必要

    if (fscanf(infile,"%d: %s %d", &ID, medium, &rating) != 3 ... 
    

    読む。

これは、すべてのコードを詳細に分析することなく表面を傷つけています。呼び出し元のコードにmediumを返そうとしていないことを確認する必要があります。 create_record()が妥当な仕事をしている場合は、これは問題ありません。 create_record()にレコードIDが伝えられていないことは奇妙です。

+0

このチェックを!= 3に変更し、' char medium [7] 'を変更しましたが、何らかの理由で私の "タイトル"の文字列が正しく読み込まれていない....'1:ザ・クイーンDVD 3 メディア:DVDタイトル:(ヌル) 2:(ヌル)DVD 3 ' – Layla

+0

また、レコードは、新しい「レコード」に動的にメモリが割り当てられるたびにインクリメントする静的変数ですそれぞれの "create_Record()"関数で自動的に処理されるようにします。 – Layla

+1

'%s'形式がデータ(またはEOF)の最初の空白まで読み込まれることを忘れないでください。 'The'では7バイトで十分ですが、それ以外のものには十分なスペースがありません。私はあなたがこの時点で 'scanf()'を使用するべきであると確信していません。 –

関連する問題