プロが教える店舗&オフィスのセキュリティ対策術

ファイルに文字列を改行などを加えながら格納し、条件にそってファイルから取り出し表示します。
その後ファイルの中身、取り出しと表示に使った変数を空にしたいと思って作ったwindowsプログラムの一部で下記のようにしているのですが
一回目のoutを表示すると正しく表示されるのですが
それ以降,前の文字列が半端に混じって表示されます。
word.txtの中身は空になってるのを確認したのですが
woかoutの中身が綺麗にクリアされていないみたいです。何故でしょうか? 解決策を教えて下さい、お願いします。

FILE *words;
int a;
char lo[256], wo[256], out[256];

//文字列をファイルに出力
words = fopen("word.txt" , "a")
fprintf(words , lo);

if(a>0)
fprintf(words, "\n");
else
fprintf(words , " ");
fclose(words);

//ファイルから指定サイズの要素を入力
words=fopen("word.txt", "r");
fread( wo, sizeof( char ), 256, words );
wsprintf(out, "%s", wo); //DrawTextへ
fclose(words);

//ファイルの中身を破壊
words=fopen("word.txt", "w");
fclose(words);

//変数内の文字列を消す
strcpy(out, "");
strcpy(wo, "")

A 回答 (4件)

//変数内の文字列を消す


strcpy(out, "");
strcpy(wo, "");



memset(out,(unsigned char)0x00, sizeof(out));
memset(wo,(unsigned char)0x00, sizeof(wo));

strcopyで""をコピっても、\0が文字コピーされるだけで、初期化したことになりません。初期化するなら\0でバッファサイズ分、全て初期化しましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
strcpyじゃ表示を消してるだけなんですね。
無事中身が消えました。

お礼日時:2006/02/14 01:48

全然、質問には無いけど、



>if(a>0)

のint型変数aは、宣言したまま何もせずに、いきなり判定するんですか?

この回答への補足

説明不足ですみません
FILE *words;
int a;
char lo[256], wo[256], out[256];
はグローバル宣言しています。

他の処理はウィンドウプロシージャ内のプログラムの一部でaは必要箇所で初期化されています。

補足日時:2006/02/14 01:06
    • good
    • 0

>fread( wo, sizeof( char ), 256, words );


はファイルの残りの文字数が256以上の時は256バイト256未満の時は残り全て読み込みます、読み込み時に後ろに'\0'は付けません。
>それ以降,前の文字列が半端に混じって表示されます。
freadで'\0'を書き込んでいないので表示時にfreadで読み込んだ以上を表示します。

fprintfは出力バイト数が可変、freadは固定長なので、fprintfで書き込んだものをfreadで読み込むのは大変です。

この回答への補足

確かにfreadで無理して読み込む必要もないですよね

補足日時:2006/02/14 01:39
    • good
    • 0

ローカル変数の原則で、中身は最初不定ですよ。



変数宣言した後は、すぐ初期化して下さい。

最後に初期化しても、ローカル変数の宣言時点で変わりますのでどうなっても文句は言えません。

この回答への補足

すみませんでした。
各配列はstatic char またはグローバル宣言しています。

他の処理はウィンドウプロシージャ内で行っています。

補足日時:2006/02/14 01:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!