2010-12-03 11 views
3

テキストにファイルを書き込む際に問題があります。ご覧のとおり、私は\nを使って別のデータセットを次の行に置きました。問題は、ファイルを閉じて、\nで終わる1行のデータをもう一度保存すると、\n\nというようになります。私のファイルは、このCプログラミングfprintf問題

FIRST SAVE

test, test, test 
test, test, test 

SECOND SAVEなぜ私は画面に表示するときだ

test, test, test 

test, test, test 

THIRD SAVE

test, test, test 


test, test, test 

のように見える理由です...その間にゴミ値があります...私のコードは次のとおりです:

save(){ 
    int i = 0; 
    FILE *stream = NULL; 
    stream = fopen("student.txt", "wt"); 
    printf("\nSaving the student list directory. Wait a moment please..."); 
    printf("\nExiting the program..."); 
    for (i=0; i<recordCtr; i++){ 
     fprintf(stream, "%s, %s, %s\n", array[i]->studentID, array[i]->name, array[i]->course); 
    }     
} 

助けてください...任意の提案をいただければ幸いです。前もって感謝します。私はこれを推測している

+3

配列 'に何である[I] - > course'?最後に改行がありますか? 'array [i] - > studentID'には何がありますか?初めに改行がありますか? –

+1

'array [i] - > course'に別の改行ターミネーターがある可能性は非常に高いです。ヒント: 'fgets()'は、改行ターミネータとともに行全体を読み込みます。どのようにファイルを「再保存」していますか? – ruslik

答えて

5

ないあなたが正確に何をすべきかの確認ができますが、おそらくあなたは、元の最後の文字列から古い\nを削除するには忘れている再びそれを保存する前にファイルをバック解析した場合..

EDIT:これは実際に右です。 OPは、ラインターミネータを含むfgets関数を使用します。

strtokで "test、test、test \ n"から始めて、 "test" "test" "test \ n"を取得して、新しい改行(忘れてしまった)を保存するようにします。ファイル。

あなたは、あなたがまた使用区切り文字に\nを追加することができます

(fgetsのは、それ自体でNULLで終わる文字列を返すので、それが安全である)

linebuffer[strlen(linebuffer)-2] = '\0' 

でnullに最後の文字を設定することで、それを修正することができあなたは同じ振る舞いで終わるべきです(strtokで空のトークンについてはわかりませんが、IIRCは単に破棄されます)。ここで

+0

彼はすでにこれを認めています - '問題は、ファイルを閉じてファイルをもう一度保存する\ nが\ n \ nとなることです。 – DMan

+0

@DMan:彼はそれをどうやってやっていると思いますか? – ruslik

+0

なぜdownvoteは実際に? – Jack

3

は、Windows上にある - あなたの行に変更:

stream = fopen("student.txt", "wt"); 

へ:

stream = fopen("student.txt", "wb"); 

をそして、あなたは余分な\r秒を取得することはできません。

また、fprintfの文字列の最後に既に改行があります。

+0

これは修飾語のためではありません。 – ruslik

+0

ストリーム= fopen( "student.txt"、 "wb");助けてくれない..何をする? – newbie

3

あなたのarray[i]->courseフィールドに最後に保存した\ nが含まれていると思います。配列に値を設定するコードを確認し、改行文字をスキップしていることを確認してください。

+0

どうすれば改行文字をスキップすることができますか?それのための機能はありますか、私はそれを私自身で書く必要がありますか? – newbie

3

fgets(linebuffer, 45, stream); 

削除がある場合linebufferから\nを末尾:

for (int i=strlen(linebuff)-1; i>=0 && linebuff[i]=='\n'; linebuff[i--]='\0'); 
関連する問題