質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.57%

C言語の構造体 問題について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 568

lapo

score 15

typedef struct{
char    name[20]; 
short   age;            
char    blad[3]; 
}MEMBERS;
MEMBERS member[] = { {"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 <stdio.h>
#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);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • showkit

    2018/11/14 15:33

    自分がどこまで 書いたか、くらいまでは 掲載しましょう。そうでないと「丸投げ」と評価されますよ。

    キャンセル

  • mrkmyki

    2018/11/14 15:33

    うまくいっていないなりに、今書いているコードと実行結果を貼って、分からない部分をもう少し絞り込んで質問すると良いと思います。

    キャンセル

  • y_waiwai

    2018/11/14 15:34

    あなたのその、なかなかうまくいかないというコードを提示してください。質問を編集して、<code>ボタン、’’’の枠の中にコードを貼り付けてください

    キャンセル

  • lapo

    2018/11/14 15:35

    失礼いたしました! これからコードを貼り付けます。 皆様ご指摘の程ありがとうございます!

    キャンセル

回答 1

checkベストアンサー

+2

気になった点を順に。

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)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 17:04

    わざわざありがとうございます! 大変わかりやすいご説明感謝いたします。

    キャンセル

  • 2018/11/14 17:26 編集

    CSVのカンマ前後に空白入れるのは互換性に問題があります。
    RFCでは、空白を無視せずにデータに含めることを推奨するように読み取れる文言があります。

    キャンセル

  • 2018/11/14 17:57

    ご指摘ありがとうございます。サンプルコードを修正いたしました。

    キャンセル

  • 2018/11/15 09:54

    ご丁寧にありがとうございます! この回答を元に組み立てなおしうまく動作するようになりました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る