fwriteのは() は、我々は構造を以下したとし、Cのファイルに構造を記述するために使用されます。cファイルでfwrite()がどのように機能しますか?
struct student{
int rollno;
char name[20],grade;
float total;
};
- それがファイルに私たちが
fwrite()
でそれを書くたびにフルsizeof(struct tudent)
バイトを書くのですか? name
に少数の文字しか保存していない場合でも、ファイルに20バイトの記憶容量を持つname
を書き込んでいますか?と
fputs() fputc() putw()
, などの他の機能を使用して書き込みレコードを変更することはできますが、これらの機能はレコードを正しく変更していないようですか?#include<stdio.h> #include<stdlib.h> struct student{ int rollno; char name[20],grade; float total; }; void display(struct student s2 ){ printf("Name: %s\nRoll Number: %d\nTotal markes: %f\nGrade: %c",s2.name,s2.rollno,s2.total,s2.grade); } int main(){ struct student s1,s2; FILE *fp; int choice; fp=fopen("file.txt","r+"); if(!fp){ printf("\nerror in opening file.txt"); exit(1); } printf("Enter student detail:-\nEnter name: "); scanf("%s",s1.name); printf("Enter rollno: "); scanf("%d",&s1.rollno); printf("Enter the total marks: "); scanf("%f",&s1.total); printf("Enter the grade: "); scanf(" %c",&s1.grade); fwrite(&s1,sizeof(s1),1,fp); fseek(fp,0,SEEK_SET); fread(&s2,sizeof(s2),1,fp); display(s2); printf("\nModify student record"); while(1){ printf("\n1: modify name\n2: modify rollno\n3: Exit\nchoice: "); scanf("%d",&choice); switch(choice){ case 1: printf("\nEnter name: "); scanf("%s",s1.name); fseek(fp,0,SEEK_SET); fputs(s1.name,fp); fseek(fp,0,SEEK_SET); fread(&s2,sizeof(s2),1,fp); display(s2); break; case 2: printf("\nEnter rollno"); scanf("%d",&s1.rollno); fseek(fp,sizeof(s1.name),SEEK_SET); putw(s1.rollno,fp); fseek(fp,0,SEEK_SET); fread(&s2,sizeof(s2),1,fp); display(s2); default:fclose(fp); return 0; } } return 0; }
ここで鍵となるのは、構造体の各メンバーのサイズが完全にわかっていることです。ですから、 'sizeof(struct student) 'を使った' fwrite'は構造体全体を記述します - あなたはそれらを 'fwrite'と' fread'することができますが、キャッチがあります。 'sizeof(struct student) 'に含まれるパディングは、コンパイラごとに異なります。つまり 'fwrite'と' fread'を一つの箱でコンパイルすることができますが、書かれたファイルを別のマシンで再コンパイルし、同じデータを読み込むことを保証するものではありません。 * データ。 –