試しに以下のコードをgcc 4.8.1でコンパイルし、実行したところ、出力は期待したとおりでしたが、
デバッガ(GDB 7.6.1)で85行目でbreakし、happening[happ_num].message[0].messをprintしたところ、文字化けが確認されました。
デバッガだけに頼らず、printfDxなど他の方法でデータを確認してみてください。
また、問題の切り分けのために、半角(ASCIIに含まれる)文字のみのメッセージでテストしてみてください。
コード:
#include <cstdio>
#include <cstdlib>
FILE* hack_file;
int FileRead_open(const char* fname) {
hack_file = fopen(fname, "r");
if (hack_file == NULL) return 0;
return 1;
}
int FileRead_getc(int) {
return getc(hack_file);
}
void FileRead_close(int) {
fclose(hack_file);
}
void printfDx(const char* str) {
fputs(str, stdout);
}
const int MESS_MAX = 128;
const int MESSAGE_MAX = 1000;
typedef struct{
char mess[MESS_MAX];//メッセージ本体
char hoge[MESS_MAX];
int fuga;
char foo[MESS_MAX];
}message_t;
typedef struct{
message_t message[MESSAGE_MAX];//そのメッセージのイベント会話順
}happening_t;
happening_t happening[1];
const int happ_num = 0;
void load_story(){
int n,num,i,fp;
char fname[32]="test.csv"; //{"../dat/csv/storyH0.csv"};
int input[64];
char inputc[64];
fp = FileRead_open(fname);//ファイル読み込み
if(fp == NULL){
printfDx("read error\n");
return;
}
for(i=0;i<2;i++)//最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');
n=0 , num=0;
while(1){
for(i=0;i<64;i++){
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/'){//スラッシュがあれば
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n'){//カンマか改行なら
inputc[i]='\0';//そこまでを文字列とし
break;
}
if(input[i]==EOF){//ファイルの終わりなら
goto EXFILE;//終了
}
}
switch(num){
case 0: sprintf(happening[happ_num].message[n].mess,"%s",inputc);break;
case 1: sprintf(happening[happ_num].message[n].hoge,"%s",inputc);break;
case 2: happening[happ_num].message[n].fuga=atoi(inputc);break;
case 3: sprintf(happening[happ_num].message[n].foo,"%s",inputc);break;
}
num++;
if(num==4){
num=0;
n++;
}
}
EXFILE:
FileRead_close(fp);
}
int main(void) {
load_story();
for (int i = 0; i < MESSAGE_MAX; i++) {
if (happening[happ_num].message[i].hoge[0] == '\0') break;
printf("no = %d\n", i);
printf("mess = %s\n", happening[happ_num].message[i].mess);
printf("mess = %s\n", happening[happ_num].message[i].hoge);
printf("fuga = %d\n", happening[happ_num].message[i].fuga);
printf("foo = %s\n", happening[happ_num].message[i].foo);
puts("----------");
}
return 0;
}
※このコードはDXライブラリを使用しません