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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

552閲覧

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

lapo

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/14 06:23

編集2018/11/14 06:37

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行目
  • └────┴──┴───┘

というような問題があるのですが、中々うまくいきません・・・。
よろしければ教えていただけないでしょうか、お願いいたします

追記、コードを記載いたしました・・・!

C

1 2#include <stdio.h> 3#include"kadai.h" 4 5 6/*プロトタイプ宣言*/ 7void Output(int Number,void *ShainInfo); 8 9int main(void) 10{ 11 int KEY; 12 13 scanf("%d",&KEY); 14 15 Output(KEY,&member); 16return 0; 17} 18 19 20 21void Output(int Number,void *ShainInfo) 22{ 23 FILE *op; 24 op=fopen("kadai3.csv","wb"); 25 fprintf(op,ShainInfo[Number-1]); 26 fclose(op); 27} 28 29

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

showkit

2018/11/14 06:33

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

2018/11/14 06:33

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

2018/11/14 06:34

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

2018/11/14 06:35

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

回答1

0

ベストアンサー

気になった点を順に。

C

1void Output(int Number,void *ShainInfo)

あえてvoid *型で渡す必要性が分かりません。MEMBERS *では駄目な理由が有るのでしょうか?

C

1FILE *op;

"op"は"output"の略称だと思うのですが、プログラムが大規模になればなるほど略称は混乱のもとになります。ここは、単に"output"とか"file"としても良いかと思います。

C

1op=fopen("kadai3.csv","wb");

バイナリモードでファイルを開く意図が分かりません。csvファイルならテキストモードで十分なはずです。
あと、ファイルオープンに成功したかの判定もすべきですね。

C

1fprintf(op,ShainInfo[Number-1]);

fprintf()関数の仕様をまず理解しましょう。
基本は下記の通りです。もっと色々したければ、ググれば沢山情報があります。

C

1FILE *output; 2output = fopen( "kadai3.csv", "w" ); 3fprintf( output, "%c,%s,%d\n", 'x', "hoge", 39 ); // 「x,hoge,39」と改行がファイルに書き込まれる。

// 以下、追記です。

C

1void Output(int Number,void *ShainInfo)

引数・変数問わず、処理中に変化しないものはconstにすべきです。

  1. ソースを後で読む人(数カ月後の自分かもしれませんし、他人かもしれません)が、「この引数・変数は変化しないんだな」と理解しやすくなります。
  2. 誤って代入してしまった場合に、早期発見・解決に繋がります。

よくある例だと

C

1if( Number = 4 ) エラー処理;

としてしまう等ですね。

という訳で、私なら上記のコードはこう書きます。

C

1void Output(const int Number,void *const ShainInfo)

投稿2018/11/14 07:02

編集2018/11/14 08:56
rtr1950x

総合スコア298

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lapo

2018/11/14 08:04

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

2018/11/14 08:27 編集

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

2018/11/14 08:57

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

2018/11/15 00:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問