質問: { {"tanaka" , 18, "C" }, {"yamada" , 15, "A" }, {"satou", 12, "AB" } }; 関数名:INFO_OUT を用意し、その関数内でfprintfかfwriteを使用し 上記の構造体MEMBERS member[]を用意し、 入力キー毎に以下の内容をエクセルファイルに出力すること 引数:1~3の入力キー(入力) MEMBERS member構造体(入力) 戻り値 0 1を入力した場合 * ┌────┬──┬───┐ * │name │age │blad │1行目 * ├────┼──┼───┤ * │tanaka │15 │A │2行目 * └────┴──┴───┘ というような問題があるのですが、中々うまくいきません・・・。 よろしければ教えていただけないでしょうか、お願いいたします 追記、コードを記載いたしました・・・! ``` #include #include"kadai.h" /*プロトタイプ宣言*/ void Output(int Number,void *ShainInfo); int main(void) { int KEY; scanf("%d",&KEY); Output(KEY,&member); return 0; } void Output(int Number,void *ShainInfo) { FILE *op; op=fopen("kadai3.csv","wb"); fprintf(op,ShainInfo[Number-1]); fclose(op); } ```
回答: 気になった点を順に。 ``` void Output(int Number,void *ShainInfo) ``` あえてvoid *型で渡す必要性が分かりません。MEMBERS *では駄目な理由が有るのでしょうか? ``` FILE *op; ``` "op"は"output"の略称だと思うのですが、プログラムが大規模になればなるほど略称は混乱のもとになります。ここは、単に"output"とか"file"としても良いかと思います。 ``` op=fopen("kadai3.csv","wb"); ``` バイナリモードでファイルを開く意図が分かりません。csvファイルならテキストモードで十分なはずです。 あと、ファイルオープンに成功したかの判定もすべきですね。 ``` fprintf(op,ShainInfo[Number-1]); ``` fprintf()関数の仕様をまず理解しましょう。 基本は下記の通りです。もっと色々したければ、ググれば沢山情報があります。 ``` FILE *output; output = fopen( "kadai3.csv", "w" ); fprintf( output, "%c,%s,%d\n", 'x', "hoge", 39 ); // 「x,hoge,39」と改行がファイルに書き込まれる。 ``` // 以下、追記です。 ``` void Output(int Number,void *ShainInfo) ``` 引数・変数問わず、処理中に変化しないものはconstにすべきです。 1. ソースを後で読む人(数カ月後の自分かもしれませんし、他人かもしれません)が、「この引数・変数は変化しないんだな」と理解しやすくなります。 2. 誤って代入してしまった場合に、早期発見・解決に繋がります。 よくある例だと ``` if( Number = 4 ) エラー処理; ``` としてしまう等ですね。 という訳で、私なら上記のコードはこう書きます。 ``` void Output(const int Number,void *const ShainInfo) ```