2017-11-22 16 views
0

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; 
    } 
    
+0

ここで鍵となるのは、構造体の各メンバーのサイズが完全にわかっていることです。ですから、 'sizeof(struct student) 'を使った' fwrite'は構造体全体を記述します - あなたはそれらを 'fwrite'と' fread'することができますが、キャッチがあります。 'sizeof(struct student) 'に含まれるパディングは、コンパイラごとに異なります。つまり 'fwrite'と' fread'を一つの箱でコンパイルすることができますが、書かれたファイルを別のマシンで再コンパイルし、同じデータを読み込むことを保証するものではありません。 * データ。 –

答えて

3

fwriteは、C関数であり、(要求されない限り)特別な処理を行うことなく、他の関数と同様に構造を扱います。この構造体はバイナリオブジェクトとして取得し、必要なだけ多くのバイトを書き込みます。

fwrite()と書き込むたびにファイルには完全にsizeof(struct tudent)バイトが書き込まれますか?

それはあなたが書くことfwriteを頼むサイズを書き込み、それがsizeof(structX)だ場合には、そのサイズを書き込みます。同じfwriteを2回実行すると、2回書き込まれます。

あなただけnameに数文字を保存している場合でも、そう、それは、ファイル上のストレージの20バイトのnameを書くんか?

nameは、20バイトかかるchar[20]と宣言されています。つまり、「文字列」に3文字しか含まれていなくても(つまり、'\0'は4番目の位置にありますが、20バイトすべてが書き込まれます)、ディスク上の部分は20バイトです。

それが事実であるならば、我々はそのような他のfputs() fputc() putw()として機能し、 が、これらの機能のdoesntでfread()を使って書かれたレコードを変更することができ、正しくレコードを変更するように見えますか?

putwは、それが(バイナリ言葉ではなく、その文字列表現)ですが、man pageで推奨されているように、より良いfwriteを使用するようintを意味し、ストリームに単語を書き込みます。 fputcは一意の文字を書き込みます。 fputsは、ゼロバイトがどこかに隠されているかどうかにかかわらず、必要な文字数を書き込むfwriteとは異なり、NULLで終了する文字列を書き込みます。

2

すべてのことfwriteのは見ることができ、メモリ内の構造体です。フィールド名、オフセット、または関連する情報はわかりません。基本的にメモリをファイルに直接書き込むだけです。したがって、構造体の残りの部分とともに、20バイトの文字列をすべて書きます。

人間が判読可能な形式で物を書きたい場合は、各フィールドについて知っている関数を書いてフォーマットする必要があります。

これは、Cが変数またはフィールドの名前や型などの情報を格納して利用し、その情報を実行時に使用できるようにする、「反映」と呼ばれるものを所有していないためです。そのようなことをすることができるゴランのような他の言語があります。

関連する問題