重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

現在VisualC++でアドレス帳を作成しています。
一人を構造体として、各メンバに値を入力し、ファイルに出力するプログラムを組みましたが、出力ファイルには文字化け?のようなものが出てきてしまいます。

メンバ変数に char* name があり、最初に
name = (char *)malloc(NameLength);
としてメモリを確保し、コンソール画面では全角入力によりデータを格納しています。
また char* age としてメンバを定義した場合は半角入力でデータを与えています。

これらを標準出力fopen("filename.txt", "w");より出力した場合変なもじ?が出力されてしまいます。

出力は fputs関数を利用しています。
文字化けを防ぐ方法はないでしょうか?

A 回答 (1件)

書かれたコードをすべて提示していただけますか?

この回答への補足

返答ありがとうございます。
少し長くなってしまったので、誤りがありそうな部分のみ提示させてもらいます。もしほかに必要な部分がありましたら申し訳ないですが再度要求をお願いします。
まず入力部分です

void AddMember(PersonalData **src){
 PersonalData *temp;
 temp = (PersonalData *)malloc(sizeof(PersonalData));
 MakeMemory(temp);
 printf("[ 名前 ] :");gets(temp->Name);
 printf("[ フリガナ ] :");gets(temp->Kana);
 printf("[ 年齢 ] :");gets(temp->Age);
 printf("[ 郵便番号 ] :");gets(temp->PostCode);
 printf("[ 住所 ] :");gets(temp->Address);
 printf("[ 電話番号 ] :");gets(temp->TelephoneNumber);
 printf("[ 携帯電話番号 ] :");gets(temp->CellularPhoneNumber);
 printf("[ メールアドレス1 ] :");gets(temp->MailAddress1);
 printf("[ メールアドレス2 ] :");gets(temp->MailAddress2);
 printf("[ メールアドレス3 ] :");gets(temp->MailAddress3);
src[TotalMember] = temp;
TotalMember++;
}

人の構造体をPersonalDataとし、各メンバにデータを与える部分です。
その後構造体を管理する引数 **src に登録する。

次にデータ保存部分です。
void WriteMemberFile(const PersonalData **src, int Member){
int i;
FILE *fp;

fp = fopen("MembersFile.txt","w");
fprintf(fp, "%d\n", TotalMember);
for(i=0; i<Member; i++){
UnTrimKaigyou(src[i]);
fputs(src[i]->Kana, fp);
fputs(src[i]->Name, fp);
fputs(src[i]->Age, fp);
fputs(src[i]->PostCode, fp);
fputs(src[i]->Address, fp);
fputs(src[i]->TelephoneNumber, fp);
fputs(src[i]->CellularPhoneNumber, fp);
fputs(src[i]->MailAddress1, fp);
fputs(src[i]->MailAddress2, fp);
fputs(src[i]->MailAddress3, fp);
}
fclose(fp);
}
for分の次に出てくる関数ですが、構造体のメンバ変数は全て改行文字を終端記号にしているため、逆に終端記号を改行文字に変換するための関数です。以下に示します

void my_struntrim(char *buff1){
while(*buff1 != '\0')
buff1++;
*buff1 = '\n';
}
よろしくお願いします。

補足日時:2007/05/26 21:48
    • good
    • 0
この回答へのお礼

連続書き込み申し訳ありません。
何とか自力で解決することができました。

gets関数からfgets関数に変更し、ファイルポインタの部分をstdinとして読み込みました。
結果こちらのほうが良かったのかもしれません。
getsの場合入力バッファがあふれる可能性がありますが、fgetsの場合は読み込む量を指定できるので、バッファの恐れがありません。が、ファイルからの入力同様に改行コードまで読み込んでしまうため、改行コードを終端記号に置き換える作業が必要になりますが、これはたいした問題ではありません。

ありがとうございました。

お礼日時:2007/05/27 02:19

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