バイナリへの出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
タマ

バイナリへの出力

#1

投稿記事 by タマ » 15年前

typedef struct {
int year;
short month;
short day;
} Date;

typedef struct {
char name[40];
char university[40];
char department[40];
Date birthday;
char hobby[40];
} Student;
↑の文を使って、bininfo(拡張子無し)というファイルに最大5人分の生徒の情報を書き込む問題です。
出力例:
Input next student, please:
Name:
Tanaka Jiro
University:
Sakana Gakuin
Department:
Integrated Information Technology
Birthday:
2002/2/22
Hobby:
Tennis, Tea Ceremony, Go

ヒントなどで、
・ファイルの最初に生徒の人数を出力する(バイナリモードで)
と書いてあるのですがいまいち分からないです。

次のレスで、途中まで書いた文を載せます。

タマ

Re:バイナリへの出力

#2

投稿記事 by タマ » 15年前

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int year;
short month;
short day;
} Date;

typedef struct {
char name[40];
char university[40];
char department[40];
Date birthday;
char hobby[40];
} Student;

int main(void)
{
int i;
Student s;
FILE *fp;
fp=fopen("bininfo", "wb");
printf("Input next student,please:\nName:");
fgets(s.name,sizeof(s.name),stdin);
fwrite(&s.name,sizeof(s.name),1,fp);
printf("University:");
fgets(s.university,sizeof(s.university),stdin);
fwrite(&s.university,sizeof(s.university),1,fp);
printf("Department:");
fgets(s.department,sizeof(s.department),stdin);
fwrite(&s.department,sizeof(s.department),1,fp);
printf("Birthday:");
fgets(s.birthday,sizeof(s.birthday),stdin);
fwrite(&s.birthday,sizeof(s.birthday),1,fp);
printf("Hobby:");
fgets(s.hobby,sizeof(s.hobby),stdin);
fwrite(&s.hobby,sizeof(s.hobby),1,fp);
fclose(fp);
return(0);
}

Birthdayの部分を出力例のように表示させる方法のヒントも教えていただけると嬉しいです。

Poco

Re:バイナリへの出力

#3

投稿記事 by Poco » 15年前

> Birthdayの部分を出力例のように表示させる方法のヒントも教えていただけると嬉しいです。

とりあえず入力された誕生日を変数として取得するサンプルを上げておきます。
----
#include <stdio.h>

int main()
{
char buf[256] = {0};
int year = -1;
int month = -1;
int day = -1;

fgets( buf, 255, stdin );
sscanf( buf, "%d/%d/%d", &year, &month, &day );
printf( "year: %d\nmonth: %d\nday: %d", year, month, day );
getchar();

return 0;
}

タマ

Re:バイナリへの出力

#4

投稿記事 by タマ » 15年前

一番上の記事とは違ってしまいますが、typedef structの部分はそのままにして、
myinfo.txtから読み込んでそれをバイナリファイルに出力するプログラムを作り方で
int main(void)
{
Student s;
FILE *fp;
fp=fopen("myinfo.txt","r");
sscanf(fp,"%s/%s/%s/%d/%d/%d/%s",s.name,s.university,s.department,
&s.birthday.year,&s.birthday.month,&s.birthday.day,s.hobby);
fclose(fp);
fp=fopen("bininfo", "wb");
printf("Input next student,please:\nName:");
fwrite(&s.name,sizeof(s.name),1,fp);
printf("University:");
fwrite(&s.university,sizeof(s.university),1,fp);
printf("Department:");
fwrite(&s.department,sizeof(s.department),1,fp);
printf("Birthday:");
fwrite(&s.birthday,sizeof(s.birthday),1,fp);
printf("Hobby:");
fwrite(&s.hobby,sizeof(s.hobby),1,fp);
fclose(fp);
return(0);
}

これをコンパイルすると、sscanf内で
エラーが起きていると出てくるのですが一体何がいけないのでしょうか?

Poco

Re:バイナリへの出力

#5

投稿記事 by Poco » 15年前

> これをコンパイルすると、sscanf内で
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?

sscanfの第一引数に求められる変数はconst char *型です。
それなのに、タマさんは第一引数にFILE*型の変数を渡しています。
これがエラーの直接の原因です。適切な型の変数を渡すことでエラーは解消されます。

し・か・し、ファイルを読むときには、sscanfは使用できません。
sscanfは、メモリ上の値を読む関数です。
ファイルを読みたい場合は、fscanfを使ってください。

box

Re:バイナリへの出力

#6

投稿記事 by box » 15年前

> これをコンパイルすると、sscanf内で
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?

sscanfとfscanfとがごっちゃになっていませんか?
両方の関数の第1引数の違いをよ~く比べてみましょう。

閉鎖

“C言語何でも質問掲示板” へ戻る