なぜFILEポインターはコピーできないのですか？


以下のようなコードを書きます。  
`char *n1,*n2;`のようにポインタを独立したものと定義すればそれぞれの値に応じて文字を取得できますが、`FILE *fp1,
*fp2;`は独立していますが、fgetcを呼ぶたびにポインタが更新されています。

[code]

    int main(int argc, char** argv){
        FILE *fp;
        fp = fopen("main.text", "w");
        char nn[]="mainworld";
        fputs(nn, fp);
        fclose(fp);
        fp = NULL;
    
        FILE *fp1, *fp2;
        char *n1,*n2;
        fp = fopen("main.text", "r"); //ファイルへのポインタを代入
        n1=nn;//文字列へのポインタを代入
    
        //コピー
        fp2 = fp;
        n2=n1;
        while (1) {//それぞれに対して一文字ずつ取り出す操作
    
            printf("%c%c",*(n1++), (char) fgetc(fp));
            if (feof(fp))break;
            printf("%c%c",*(n2++), (char) fgetc(fp2));
            if (feof(fp2))break;
        }
        return 0;
    }
    
[/code]

EOFを出力していますが気にしないでください。仕様です。

もっとわかりやすいコードでは、ファイルの時のものとメモリ内の文字列の時とに分け２つのコードと実行結果の比較がわかりやすいかと思います。なので
`printf("%c,%c",*(n1++),*(n2++));`と`printf("%c%c", (char) fgetc(fp), (char)
fgetc(fp2));//この書き方あまり良くなかったかも`の２つの時比べてもらえるとわかりやすいです。



[code]

    FILE *fp, *fp1;
    fp = fopen("main.text", "r");
    fp1 = fp;
    
[/code]

とすると、

[code]

    +---+
    |fp | -------+      +----------+
    +---+        |      |          |
                 +----->| FILE     |
    +---+        |      |          |
    |fp1| -------+      +----------+
    +---+
    
[/code]

という状況になります。  
FILEにはバッファやファイル位置などの情報が含まれています。  
fgetc(fp)は上記のFILEに対する操作で、fgetc(fp1)もやはり上記のFILEに対する操作です。  
fgetc(fp)もfgetc(fp1)も同じFILEに対する操作になります。

同じFILEに対する操作ではなくそれぞれ独立した操作にしたいのであれば、

[code]

    FILE *fp, *fp1;
    fp = fopen("main.text", "r");
    fp1 = fopen("main.text", "r");
    
[/code]

とすれば

[code]

                        +----------+
    +---+               |          |
    |fp | ------------->| FILE     |
    +---+               |          |
                        +----------+
                        +----------+
    +---+               |          |
    |fp1| ------------->| FILE     |
    +---+               |          |
                        +----------+
    
[/code]

となって、  
fgetc(fp)とfgetc(fp1)はそれぞれ独立したFILEに対する操作になります。



[code]

    FILE *fp, *fp1;
    fp = fopen("main.text", "r");
    fp1 = fp;
    
[/code]

とすると、

[code]

    +---+
    |fp | -------+      +----------+
    +---+        |      |          |
                 +----->| FILE     |
    +---+        |      |          |
    |fp1| -------+      +----------+
    +---+
    
[/code]

という状況になります。  
FILEにはバッファやファイル位置などの情報が含まれています。  
fgetc(fp)は上記のFILEに対する操作で、fgetc(fp1)もやはり上記のFILEに対する操作です。  
fgetc(fp)もfgetc(fp1)も同じFILEに対する操作になります。

同じFILEに対する操作ではなくそれぞれ独立した操作にしたいのであれば、

[code]

    FILE *fp, *fp1;
    fp = fopen("main.text", "r");
    fp1 = fopen("main.text", "r");
    
[/code]

とすれば

[code]

                        +----------+
    +---+               |          |
    |fp | ------------->| FILE     |
    +---+               |          |
                        +----------+
                        +----------+
    +---+               |          |
    |fp1| ------------->| FILE     |
    +---+               |          |
                        +----------+
    
[/code]

となって、  
fgetc(fp)とfgetc(fp1)はそれぞれ独立したFILEに対する操作になります。

