前記事で頂いた指摘をもとに改良。
次は入力時の例外処理なんかを調べようかな。。
userinfo.c
#include <stdio.h> //システムインクルードは < >を使う。自作ヘッダインクルードは""を使う。
#include <stdint.h> //厳密には探しにいく順番が違ったりするらしいが、、
//何よりも読み手を混乱させるのがよくないのでちゃんと覚えておこう。
#define NAME_SIZE ( 100 )
#define AGE_SIZE ( 10 )
#define ADDRESS_SIZE ( 100 )
#define SEX_SIZE ( 10 )
#define PHONE_SIZE ( 20 )
typedef struct user_info {
uint8_t name[NAME_SIZE];
uint8_t age[AGE_SIZE];
uint8_t address[ADDRESS_SIZE];
uint8_t sex[SEX_SIZE];
uint8_t phoneNumber[PHONE_SIZE];
}UserInfo;
void UserInfo_input(UserInfo* user) { //voidの書き忘れに注意。コンパイラによってはエラーでるものも?
printf("名前を入力してください->");
scanf_s("%s", user->name,sizeof(user->name));//本来は汎用的なscanfを使うところだがVC++の仕様?で仕方なく
//VC++でscanf使うとエラーに、、これは酷い気が。。
printf("\n年齢を入力してください->");
scanf_s("%s", user->age, sizeof(user->age));
printf("\n住所を入力してください->");
scanf_s("%s", user->address, sizeof(user->address));
printf("\n性別を入力してください->");
scanf_s("%s", user->sex, sizeof(user->sex));
printf("\n電話番号を入力してください->");
scanf_s("%s", user->phoneNumber, sizeof(user->phoneNumber));
}
void UserInfo_save(const UserInfo* user) { //ここではuserが指す領域は変更しない。
//こういうときはconstつけるべき。さもなくばCPUが非効率な処理?をしてしまうみたい。
FILE* fp;
if (fopen_s(&fp, "TBD.txt", "w")!= 0) { //ファイル名はuser.nameなどから持ってきたい!できない!眠い!
printf("ファイルアクセス失敗!");
}
fprintf_s(fp, "【名前】\n%s\n", user->name);
fprintf_s(fp, "【年齢】\n%s\n", user->age);
fprintf_s(fp, "【住所】\n%s\n", user->address);
fprintf_s(fp, "【性別】\n%s\n", user->sex);
fprintf_s(fp, "【電話番号】\n%s\n", user->phoneNumber);
fclose(fp);
}
int main(void) {
UserInfo user;
UserInfo_input(&user);
UserInfo_save(&user);
return 0;
}