※ ChatGPTを利用し、要約された質問です(原文:ファイルの読み込みについて)
ファイルの読み込みでエラーが発生する原因とは?
このQ&Aのポイント
VisualStudio 6.0で住所帳のファイルを読み込む際、改行コードの削除処理でエラーが発生しています。
読み込んだ郵便番号にハイフンが含まれる場合、my_strtrim関数でエラーが発生します。
ハイフンを除去しないまま読み込むと、後続の情報の表示が乱れます。
アドレス帳をコンソールで作成しようと考えています。
環境は VisualStudi 6.0 です。
住所などの個人情報が書かれたファイルからの読み込みを行うところでつまづいてしまいました。以下がファイルの形式です。
名前(全角)
年齢(半角)
郵便番号(半角)
住所(全角)
電話番号(半角)
・
・
・
となっています。一人一人の情報の間には空行はありません。
これらを行単位で読み込むように fgets を使用して読み込みました。
しかし fgets は改行コードまで含まれてしまうため、改行コードを '\0'と置き換えるような関数を作りました。
void my_strtrim(char *buff1){
while(*buff1 != '\n')
buff1++;
*buff1 = '\0';
}
この関数を付け加え、 fgets 関数の直後に my_strtrim 関数を行うことで読み込んだ文字列の改行コードを削除しようと考えました。
読み込む変数(char型)は直前で各情報毎にmallocにより動的にメモリを確保しています。
そこで実行したとき、なぜか郵便番号を読み込んだ後ののmy_strtrim関数でエラーが出てしまいます。
郵便番号を例えば 333-3333 というようにハイフンを入れた場合にエラーが出るのですが、ハイフンを除き 3333333 とした場合は表示はされるのですが、その後の情報の表示はぐちゃぐちゃになってしまいます。
何が原因なのでしょう?
お礼
2回連続の書き込み申し訳ありません。 単純なミスでした。 333-3333これで文字数は8 自分が定義した文字数はPostcodeLengthの値は8 確保したメモリの長さは9 つまり333-3333の文字列+改行コードが格納されると思ったのですが、 その後にNULL文字を格納することを忘れていました。 普通にfgetsならば 文字数+改行コード長+終端文字として確保しなければエラーが出てしまうのですね。 返答ありがとうございました。
補足
返答ありがとうございました。 説明不足で申し訳ありません。 具体的に説明させてもらいます。 一人の情報はPersonalData構造体で表し、各メンバは上記で説明したメンバ変数が定義されています。 typedef struct{ char* Kana; char* Name; char* Age; char* PostCode; char* Address; char* TelephoneNumber; char* CellularPhoneNumber; }PersonalData; まず一人のデータを読み込むため、この構造体を1つメモリ確保し、その次に構造体の各メンバについてメモリを確保して、ファイルから読み込んだデータを格納す量にしています PersonalData *personal_data; personal_data = (PersonalData *)malloc(sizeof(PersonalData)); MakeMemory(personal_data); fgets(personal_data->Kana, KanaLength + 1, fp); fgets(personal_data->Name, NameLength + 1, fp); fgets(personal_data->Age, AgeLength + 1, fp); fgets(personal_data->PostCode, PostCodeLength + 1, fp); fgets(personal_data->Address, AddressLength + 1, fp); fgets(personal_data->TelephoneNumber, TelephoneNumberLength + 1, fp); fgets(personal_data->CellularPhoneNumber, CellularPhoneNumberLength + 1, fp); TrimKaigyou(personal_data); 途中に自作関数が数個あるので、それらについて以下に提示します。 void MakeMemory(PersonalData *src){ src->Kana = (char *)malloc(KanaLength + 1); src->Name = (char *)malloc(NameLength + 1); src->Age = (char *)malloc(AgeLength + 1); src->PostCode = (char *)malloc(PostCodeLength + 1); src->Address = (char *)malloc(AddressLength + 1); src->TelephoneNumber = (char *)malloc(TelephoneNumberLength + 1); src->CellularPhoneNumber = (char *)malloc(CellularPhoneNumberLength + 1); } void TrimKaigyou(PersonalData *src){ my_strtrim(src->Kana); my_strtrim(src->Name); my_strtrim(src->Age); my_strtrim(src->PostCode); my_strtrim(src->Address); my_strtrim(src->TelephoneNumber); my_strtrim(src->CellularPhoneNumber); } この中のmy_strtrim関数は質問欄に記述してあります。 そして、ちょっと間違いがありました。 333-3333と記述した場合エラーで止まってしまうのですが、3333333と記述した場合は普通に表示することができました。 表示の部分に間違いがあったためです。 そのほかに色々と確認してみましたが、ハイフンを入れた場合に止まってしまいます。