今回作ろうとしていたプログラムは、ファイルに書き込まれている問題と答えを読み込んでクイズをするプログラムです。
そのプログラムを作る過程で
10
1+1=?,2
1+2=?,3
1+3=?,4
2+1=?,3
2+2=?,4
1+5=?,6
4+9=?,13
3+4=?,7
10+1=?,11
10-4=?,6
と書き込まれたファイルから、最初の一行で問題の数を取得し、カンマでquesとanswerの構造体のメンバに代入していこうというプログラムを以下のように書きました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
#define MAX 140
/* 構造体の宣言 */
typedef struct Quiz {
char ques[MAX], answer[MAX];
public:
} Quiz;
/* 関数のプロトタイプ宣言 */
void load(Quiz *pQ, FILE *fp);
/* ファイルを読み込んで構造体へ入れる */
void load(Quiz *pQ, char *fp){
int i,line;
ifstream ifs(fp);
char str[256];
/*エラー処理*/
if (!ifs){
cout << "Error: cannot open file" << endl;
exit(1);
}
ifs.getline(str, 260);
line = atoi(str); /* 行数を取得 */
pQ = (Quiz *)malloc(sizeof(Quiz)*(line + 1));
for (i = 0; i < line; i++){
ifs.getline(str, 260);
sscanf_s(str, "%s,%s", (pQ + i)->ques, (pQ + i)->answer); /* 構造体へ代入 */
}
}
int main(void){
Quiz quiz[MAX];
char file[256];
cin >> file;
load(quiz, file);
return 0;
}
ブレークポイントを使ってデバックしたところ、ques側に1+1=?,2と代入されていて、answer側には何も代入されていないという状況でした。
おそらくsscanf_sでの処理が上手くいっていなかったのだと推測しましたが、調べてみてもこの関数の使い方がよくわからなかったので質問しました。
sscanfはセキュリティが甘いとのエラーが出てきてつかえなかったのですが、sscanf_sでも同じ引数の指定の仕方ではいけなかったのでしょうか…
または、もっと効率の良い方法がある場合は教えていただけるとありがたいです。