• ベストアンサー

ファイルポインタが動かない・・・

ファイルポインタがfgetしても動かなくなるような宣言の仕方や 引数の渡し方ってあるのでしょうか? C言語で書いたプログラムです(長いので構造を書きます) わかりにくければ補足します。 #include"stdio.h" static FILE fp1; main() { 変数宣言うんぬん プロトタイプ宣言うんぬん fopen(.....); a = kansuu; fclose; } int kansuu() 変数宣言うんぬん for(i=0;i<3;i++) { x=fgetc(fp1); printf("%d-%d\n",x,ftell(fp1)); } ファイルには 0123456789 出力が 0-0 0-0 0-0 ってなるんです Seek関数(SEEK_CURとか)を使うとファイルポインタは動きます。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • dtm
  • ベストアンサー率37% (23/62)
回答No.8

私の勘違いでなければ、ファイルのオープンには成功しているものの、オープンしたファイルが存在しないファイルか、サイズ0のファイルではないかと。つまり、ファイル名の指定に失敗しているのでは?

kiku_kiku
質問者

お礼

回答ありがとうございます。 サイズ0でした。 この問題が起きるちょっと前に ,"w"と,"r"を一回間違えてたことを思い出しました。 あと、 サイズ0のファイルでもfseekってできるんですね。 お騒がせしました。

その他の回答 (9)

noname#2009
noname#2009
回答No.10

fgetc() の後に ungetc() でストリームに文字を 返してしまっていれば、ストリームポジションは 移動しません。しかし、そんなイレギュラーなことを するとも思えません。 ファイルポインタが移動しないという障害状況が 起こったなら、いかにして起こったのかということに こちらもちょっと興味があります。勘違いだったと しても、そういった誤解の起こりやすい状況というのを 後学の為に知りたいというのもあるので、もしまだ 未解決なのであれば、なんとかソースの抜粋を載せて みることはならんでしょうか?どんな感じか知りたいす。

kiku_kiku
質問者

お礼

回答ありがとうございます。 サイズ0でした。 この問題が起きるちょっと前に ,"w"と,"r"を一回間違えてたことを思い出しました。 あと、 サイズ0のファイルでもfseekってできるんですね。 お騒がせしました。

noname#1922
noname#1922
回答No.9

既に回答されていますが、 > static FILE fp1; static FILE *fp1; とされているのでしょうか?

kiku_kiku
質問者

お礼

>> static FILE fp1; >static FILE *fp1 大丈夫です。^^;

  • dtm
  • ベストアンサー率37% (23/62)
回答No.7

#include <stdio.h> void main() {   int b;   FILE* f = fopen(filename, "r");   while ((b = fgetc(f)) != EOF)     printf("%d-%ld\n", b, ftell(f));   fclose(f); } これでも動きませんか?(思いっきり省略してるけど)

  • dtm
  • ベストアンサー率37% (23/62)
回答No.6

あと、このプログラムって警告なしにコンパイルできてるんですか?

  • dtm
  • ベストアンサー率37% (23/62)
回答No.5

プログラムをすべて貼り付けたほうがいいのではないでしょうか。 すくなくとも、問題の for 文のある関数を書かなければ、回答が出ないと思いますよ。

kiku_kiku
質問者

お礼

回答ありがうございます。 >プログラムをすべて貼り付けたほうがいいのではないでしょうか。 え~ 私もそうしたいのですが全部書くとものすごい量になってしますので・・・ 私が尋ねたいことはfget関数を使ってもファイルポインタが 動かないことがありえるのかどうか と、 もしありえるとすればどういったパターンの時か です。 お答えしづらいとは思いますがお願いします。

  • cherry3
  • ベストアンサー率39% (18/46)
回答No.4

freadなどでもファイルポインタは動きませんか? とりあえずファイル操作関数を使用しているすべてのところで エラーチェックをしてみたらどうですか?

kiku_kiku
質問者

お礼

回答ありがとうございます。 サイズ0でした。 この問題が起きるちょっと前に ,"w"と,"r"を一回間違えてたことを思い出しました。 あと、 サイズ0のファイルでもfseekってできるんですね。 お騒がせしました。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

>ただ、質問の趣旨とはちょっと・・・ えーっと、質問の回答としては fgetc 等でファイルポインタが動かないと言う設定はありません。 というのが前提で、例えば FILE fp1; と FILE* fp1; では意味が違いますし、fopen でしっかり fp1 にアドレスが入らなければその後の動作もおかしくなります。重要な部分でしたので指摘させてもらいました。 > if((fp1=fopen(("%s",argv[1]),"r"))==NULL){ if((fp1=fopen(argv[1],"r"))==NULL){ でよいと思います。式の優先順位の関係で、結果的には argv[1] が fopenに渡りますが、"%s" は意味がありません。#これも質問とは関係ありませんね、すいません。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

int fgetc(FILE*)という関数は「文字コードを返す」という仕様のはずです。 printf("%d-%d\n", x, ftell(fp1))で最初の%dが0になるということは既におかしいですね。 ファイルの1文字目は'0'(文字のゼロ)なので0(数値のゼロ)に変換されることはないでしょう。 また、ftellはlong ftell(FILE*)のはずなので、printf("%d-%ld\n", x, ftell(fp1))でないとファイルポインタの位置は表示できないと思います。

kiku_kiku
質問者

補足

すみませんでした。 >%d-%d ではなくて %c-%ld です ftell関数は結果が合わないから導入したものです。 ファイルポインタが動いていないのは確かです。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

> static FILE fp1; FILE* です。 >fopen(.....); fp1 = fopen (.....); とりあえず気がついたところだけです。

kiku_kiku
質問者

お礼

コメントありがとうございます。 ただ、質問の趣旨とはちょっと・・・ if((fp1=fopen(("%s",argv[1]),"r"))==NULL){ puts("オープンエラー\n"); return(-1); } を省略しました。