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

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

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

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

Q&A

解決済

3回答

2640閲覧

構造体とメモリでファイルの入出力をする

nortordam

総合スコア25

C

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

0グッド

0クリップ

投稿2016/07/07 09:00

include<stdio.h>
include<stdlib.h>
typedef struct student{
int studentid;
char name[20];
char gender;
int point;
}STUDENT;

int main(void){ int i; STUDENT * st; st = (STUDENT *)malloc(10 * sizeof(STUDENT)); /* malloc関数で動的

確保(10領域)/
FILE * fp;
if((fp = fopen("021student.txt","r")) == NULL)
{printf("file open error!!¥n");
exit(EXIT_FAILURE); /
(3)エラーの場合は通常、異常終了する /}/ ファ
イルオープンの処理*/

for(i=0; i<10; i++){ fgets(st , 10, fp );/* ファイル入力処理(ポイン

タ変数stを各領域を参照し,格納)/
}
for(i=0; i<10; i++){
printf("%s",&st);
/
標準出力処理(ポインタ変数stから各領域を参照し,値を確認)*/
}

fclose(fp);/* ファイルクローズの処理*/ free(st);/* メモリの解放処理*/ return 0; }

このコードのファイル入力処理と出力処理がうまくいきません
ファイルの中身は、
14001 Aoki M 50
14002 Ishida F 60
14003 Uehara M 70
14004 Endoh F 80
14005 Ogawa F 95
14006 Katoh M 85
14007 Kimura F 55
14008 Kuwata M 95
14009 Keda F 70
14010 Kobayashi F 100
です。

※#が抜けているのはわざとです

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

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

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

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

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

PineMatsu

2016/07/07 09:06

コードは```のブロックで囲ってください。ブラウザ上では</>ボタンを押せばカーソル位置にブロックのテンプレが表示されます。
guest

回答3

0

ベストアンサー

ファイルのフォーマットは固定長ですか?可変長ですか?
全体を読み込んでから出力するのですか?
読み込みながら出力するのですか?
読み込んだものをそのまま表示するのですか?
桁を揃えるなど表示の書式を整えたりするのですか?
ファイルは10行固定ですか?
多いときもあるのですか?
少ないときもあるのですか?

これらが明確でないと適切な回答は得られないと思いますよ。


サンプルコード(未検証)

c

1#include <stdio.h> 2 3#define LINELEN 128 4#define LINEMAX 10 5 6int main(void) 7{ 8 int i; 9 char st[LINELEN][LINEMAX]; 10 FILE * fp; 11 12 if((fp = fopen("021student.txt","r")) == NULL){ 13 printf("file open error!!\n"); 14 exit(EXIT_FAILURE); 15 } 16 17 for(i = 0; i < LINEMAX; i++){ 18 fgets(st[i], LINELEN, fp); 19 } 20 21 fclose(fp); 22 23 for(i = 0; i < LINEMAX; i++){ 24 printf("%s", st[i]); 25 } 26 27 return 0; 28} 29

投稿2016/07/07 23:54

編集2016/07/08 08:09
ttyp03

総合スコア16996

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

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

nortordam

2016/07/08 02:08

不明慮な質問ですみません ファイルのフォーマットは固定長ですか?可変長ですか? >固定です 全体を読み込んでから出力するのですか? >全体を読み込みます 読み込みながら出力するのですか? >します 読み込んだものをそのまま表示するのですか? >表示したいです 桁を揃えるなど表示の書式を整えたりするのですか? >ファイルの通りに空白は開けておきたいです >ファイルは10行固定ですか?  固定です 質問ありがとうございます、今回の失敗は次につなげるようにします。
ttyp03

2016/07/08 02:13

全体を読み込んでから出力するのですか? >全体を読み込みます 読み込みながら出力するのですか? >します ここが矛盾してますね。 一旦全行を読み込んでから表示したいのか、1行ずつ読み込んで表示したいのか、どちらでしょうか。
nortordam

2016/07/08 07:54

すみません全体読み込みます。読み込みながらはしません。というのもファイルのデータを読み込んで表示したいからです
ttyp03

2016/07/08 08:09

いやどちらもファイルのデータを読み込んで表示する話なんですけどね・・・。 要約すると以下ですね。 ・ファイルは固定長 ・ファイル内全てを読み込んでから出力 ・出力形式はファイルに入っているまま ということであればこんな感じかな、というコードを貼っておきました。 参考にしてください。
nortordam

2016/07/08 08:25

細かい部分までありがとうございました
guest

0

問題は

C

1fgets(st , 10, fp );

にあります。これは「ストリームfpからstに9文字分読み込む」という処理になりますが、stはSTUDENT型の構造体へのポインターなので、これに直接読み込むのではなく、char型のバッファを用意して1行分読み込み、その読み込んだ文字列を分解してSTUDENT型の構造体の各メンバーにセットしなければいけません。

C

1char buff[80]; /* バッファは十分な量を確保すること */ 2 3fgets(buff, sizeof(buff), fp);

文字列がスペースで区切られているのなら、strtok関数で分解します。

投稿2016/07/07 09:21

PineMatsu

総合スコア3579

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

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

0

こんにちは。

ファイルはメモ帳なのでテキスト・エディタで開けるテキスト・ファイルですか?
もし、そうであれば、int型等のバイナリ形式のデータを直接リード/ライトすることはできません。
文字列で表現された数値をint型へ変換する等の処理が必要です。
fgets()で1行読み込み、sscanf()でint型等へ変換すると良いですよ。

投稿2016/07/07 09:10

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問