ファイル操作やポインタ、構造体について(C言語)
C言語の課題で詰まってしまいました。宜しければ助言を宜しくお願いします。
コマンド選択で,0) 終了,1) 追加,2) 検索(id),3)変更 が行える学生成績管理プログラムを作成する。
データは,学生の番号 名前 GP 総単位数 形で学生のデータを持っているファイルである。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student{
int id;
char name[25];
int gp;
int credit;
};
void add(char *, struct student);//追加
int search(char *, struct student *);//検索
void change(char *, struct student);//指定したidの学生の情報を変更
main(int argc,char *argv[])
{
FILE *fp;
int i = 0;
int num;
struct student students;
if(argc == 1){
printf("set filename\n");
return 1;
}
while(1) {
printf("1)add 2)search 0)quit ");
scanf("%d",&num);
if(num == 0)
break;
/* 追加 */
if(num == 1) {
printf("id name gp credit ? ");
scanf("%d %s %d %d", &students.id, students.name, &students.gp, &students.credit);
add(argv[1], students);
}
/* 検索 */
if(num == 2) {
printf("id ? ");
scanf("%d", &students.id);
if(search(argv[1],&students)){
printf("%d %s %d %d\n", students.id, students.name, students.gp, students.credit);
}
else{
printf("ID %d Not Found.\n",students.id);
}
}
if(num == 3){
//変更
}
}
}
/* 追加ルーチン */
void add(char *filename, struct student students)
{
FILE *fp;
if((fp = fopen(filename, "a")) == NULL){
printf("can't open %s\n", filename);
exit(1);
}
fprintf(fp,"%d %s %d %d\n", students.id, students.name, students.gp, students.credit);
fclose(fp);
}
/* 検索ルーチン */
int search(char *filename, struct student *students)
{
FILE *fp;
int id;
char name[25];
int gp;
int credit;
if((fp = fopen(filename, "r")) == NULL){
printf("can't open %s\n", filename);
exit(1);
}
while(fscanf(fp,"%d %s %d %d", &id, name, &gp, &credit) != EOF) {
if(id == students->id){
students->id = id;
strcpy(students->name ,name);
students->gp = gp;
students->credit = credit;
return 1;
}
}
return 0;
fclose(fp);
}
/* 変更ルーチン */
void add(char *filename, struct student students){
}
------------ここまで------------
ファイルの操作での入出力は"a"や"r"、また"w"を利用するのかとも思いましたが、
指定したIDの内容を書き換えるにはポインタを2つ使う方法しか思いつかないのですが、与えられた問題で、変更のプロトタイプは
void change(char *, struct student);
となっていて、どうやるのかまったく見当もつきません。
稚拙な文で伝わりにくいかもしれませんが、
変更のやり方についてご教授願います。
見難くて申し訳ありません。
どうか宜しくお願いします。
お礼
すいません、cをやり始めてからまだ一週間しか経ってないので 質問の内容もなにか言葉足らずになってしまいました。 でも、知りたかった回答が帰ってきてよかったです。 まさにftell関数とfseek関数の持っているような機能が 欲しかったんです。 どうもありがとうございました。