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:バイナリへの出力
#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の部分を出力例のように表示させる方法のヒントも教えていただけると嬉しいです。
#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の部分を出力例のように表示させる方法のヒントも教えていただけると嬉しいです。
Re:バイナリへの出力
> 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;
}
とりあえず入力された誕生日を変数として取得するサンプルを上げておきます。
----
#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:バイナリへの出力
一番上の記事とは違ってしまいますが、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内で
エラーが起きていると出てくるのですが一体何がいけないのでしょうか?
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内で
エラーが起きていると出てくるのですが一体何がいけないのでしょうか?
Re:バイナリへの出力
> これをコンパイルすると、sscanf内で
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?
sscanfの第一引数に求められる変数はconst char *型です。
それなのに、タマさんは第一引数にFILE*型の変数を渡しています。
これがエラーの直接の原因です。適切な型の変数を渡すことでエラーは解消されます。
し・か・し、ファイルを読むときには、sscanfは使用できません。
sscanfは、メモリ上の値を読む関数です。
ファイルを読みたい場合は、fscanfを使ってください。
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?
sscanfの第一引数に求められる変数はconst char *型です。
それなのに、タマさんは第一引数にFILE*型の変数を渡しています。
これがエラーの直接の原因です。適切な型の変数を渡すことでエラーは解消されます。
し・か・し、ファイルを読むときには、sscanfは使用できません。
sscanfは、メモリ上の値を読む関数です。
ファイルを読みたい場合は、fscanfを使ってください。
Re:バイナリへの出力
> これをコンパイルすると、sscanf内で
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?
sscanfとfscanfとがごっちゃになっていませんか?
両方の関数の第1引数の違いをよ~く比べてみましょう。
> エラーが起きていると出てくるのですが一体何がいけないのでしょうか?
sscanfとfscanfとがごっちゃになっていませんか?
両方の関数の第1引数の違いをよ~く比べてみましょう。