C言語関係掲示板

過去ログ

No.476.ファイルポインタと読み取り位置

[戻る] [ホームページ]
No.3439

ファイルポインタについて質問です。
投稿者---taito(2002/11/12 20:14:20)


はじめまして。taitoと申します。
早速ですが質問です。
以下のプログラムで、test.txtを使って実行すると、
% ./ota test.txt
abcdefghijk
fp1...l
fp2...

fp1...m
fp1...n
fp2...o
%

のように結果がでます。なぜ、最後のfp2は o になるのでしょうか?
m になるのではと思うのですが...。
これはfp1とfp2が同じものとして扱われているのでしょうか?



#include<stdio.h>

int main(int argc, char *argv[])/*ファイル名を受け取る*/
{
  FILE *fp1, *fp2;
  int Ch[500], i=0;

  if(argc != 2){
    printf("パラメータの数が違います。\n");
    return 1;
  }

  fp1=fopen(argv[1], "r");
  fp2=fopen(argv[1], "r");

  /*ファイルオープンのエラー処理*/
  if(fp1==NULL || fp2==NULL){
    printf("ファイルをオープンできませんでした。\n");
    return 1;
  }

  while((Ch[i]=fgetc(fp1))!='\n'){
    printf("%c", Ch[i]);
    i++;
  }

  printf("\n");
  
  Ch[i]=fgetc(fp1);
  Ch[i+1]=fgetc(fp2);
  
  printf("fp1...%c\n", Ch[i]);
  printf("fp2...%c\n", Ch[i+2]);
  
  printf("\n");
  fp2=fp1;
  
  Ch[i+2]=fgetc(fp1);
  Ch[i+3]=fgetc(fp1);
  Ch[i+4]=fgetc(fp2);
  
  printf("fp1...%c\n", Ch[i+2]);
  printf("fp1...%c\n", Ch[i+3]);
  printf("fp2...%c\n", Ch[i+4]);
  
  return 0;
}


test.txtの内容
abcdefghijk
lmnopqr



No.3443

Re:ファイルポインタについて質問です。
投稿者---かずま(2002/11/12 23:22:41)


> なぜ、最後のfp2は o になるのでしょうか?
> m になるのではと思うのですが...。
> これはfp1とfp2が同じものとして扱われているのでしょうか?

fp1 や fp2 は、FILE構造体へのポインタです。
ファイルの現在の読み取り位置(ファイルオフセット)ではありません。
fopen が 2つ別々にありますから、2つの FILE構造体が、ファイルオフセット
を別々に管理しています。

fp2 = fp1; を実行すると、fp2 は fp1 が指していた FILE構造体を指すように
なります。

なお、fp2 = fp1; の行を削除し、2行上の
printf("fp2...%c\n", Ch[i+2]); を
printf("fp2...%c\n", Ch[i+1]); に修正すると、
abcdefghijk
fp1...l
fp2...a

fp1...m
fp1...n
fp2...b
となります。

No.3444

Re:ファイルポインタについて質問です。
投稿者---taito(2002/11/12 23:35:45)



>fp1 や fp2 は、FILE構造体へのポインタです。
>ファイルの現在の読み取り位置(ファイルオフセット)ではありません。
>fopen が 2つ別々にありますから、2つの FILE構造体が、ファイルオフセット
>を別々に管理しています。
>
>fp2 = fp1; を実行すると、fp2 は fp1 が指していた FILE構造体を指すように
>なります。
>
>なお、fp2 = fp1; の行を削除し、2行上の
>printf("fp2...%c\n", Ch[i+2]); を
>printf("fp2...%c\n", Ch[i+1]); に修正すると、
>
abcdefghijk
fp1...l
fp2...a

fp1...m
fp1...n
fp2...b
となります。


早速のご回答、ありがとうございます。
修正部分は私の間違いでした。お手数かけます。
つまり、「fp2=fp1とした後では、fp1とfp2は同じ役割を果たす」ということでしょうか?


No.3456

Re:ファイルポインタについて質問です。
投稿者---かずま(2002/11/13 21:26:48)


> つまり、「fp2=fp1とした後では、fp1とfp2は同じ役割を果たす」ということでしょうか?

値が同じなのに、違う役割を果たすことができると思いますか?



No.3458

Re:ファイルポインタについて質問です。
投稿者---taito(2002/11/13 23:40:17)


>> つまり、「fp2=fp1とした後では、fp1とfp2は同じ役割を果たす」ということでしょうか?
>
>値が同じなのに、違う役割を果たすことができると思いますか?
>


そうですよね。ご回答どうもありがとうございました。