- ベストアンサー
ファイルポインタが動かない・・・
ファイルポインタが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とか)を使うとファイルポインタは動きます。 お願いします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
私の勘違いでなければ、ファイルのオープンには成功しているものの、オープンしたファイルが存在しないファイルか、サイズ0のファイルではないかと。つまり、ファイル名の指定に失敗しているのでは?
その他の回答 (9)
fgetc() の後に ungetc() でストリームに文字を 返してしまっていれば、ストリームポジションは 移動しません。しかし、そんなイレギュラーなことを するとも思えません。 ファイルポインタが移動しないという障害状況が 起こったなら、いかにして起こったのかということに こちらもちょっと興味があります。勘違いだったと しても、そういった誤解の起こりやすい状況というのを 後学の為に知りたいというのもあるので、もしまだ 未解決なのであれば、なんとかソースの抜粋を載せて みることはならんでしょうか?どんな感じか知りたいす。
お礼
回答ありがとうございます。 サイズ0でした。 この問題が起きるちょっと前に ,"w"と,"r"を一回間違えてたことを思い出しました。 あと、 サイズ0のファイルでもfseekってできるんですね。 お騒がせしました。
既に回答されていますが、 > static FILE fp1; static FILE *fp1; とされているのでしょうか?
お礼
>> static FILE fp1; >static FILE *fp1 大丈夫です。^^;
- dtm
- ベストアンサー率37% (23/62)
#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)
あと、このプログラムって警告なしにコンパイルできてるんですか?
- dtm
- ベストアンサー率37% (23/62)
プログラムをすべて貼り付けたほうがいいのではないでしょうか。 すくなくとも、問題の for 文のある関数を書かなければ、回答が出ないと思いますよ。
お礼
回答ありがうございます。 >プログラムをすべて貼り付けたほうがいいのではないでしょうか。 え~ 私もそうしたいのですが全部書くとものすごい量になってしますので・・・ 私が尋ねたいことはfget関数を使ってもファイルポインタが 動かないことがありえるのかどうか と、 もしありえるとすればどういったパターンの時か です。 お答えしづらいとは思いますがお願いします。
- cherry3
- ベストアンサー率39% (18/46)
freadなどでもファイルポインタは動きませんか? とりあえずファイル操作関数を使用しているすべてのところで エラーチェックをしてみたらどうですか?
お礼
回答ありがとうございます。 サイズ0でした。 この問題が起きるちょっと前に ,"w"と,"r"を一回間違えてたことを思い出しました。 あと、 サイズ0のファイルでもfseekってできるんですね。 お騒がせしました。
- yatokesa
- ベストアンサー率40% (201/496)
>ただ、質問の趣旨とはちょっと・・・ えーっと、質問の回答としては 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)
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))でないとファイルポインタの位置は表示できないと思います。
補足
すみませんでした。 >%d-%d ではなくて %c-%ld です ftell関数は結果が合わないから導入したものです。 ファイルポインタが動いていないのは確かです。
- yatokesa
- ベストアンサー率40% (201/496)
> static FILE fp1; FILE* です。 >fopen(.....); fp1 = fopen (.....); とりあえず気がついたところだけです。
お礼
コメントありがとうございます。 ただ、質問の趣旨とはちょっと・・・ if((fp1=fopen(("%s",argv[1]),"r"))==NULL){ puts("オープンエラー\n"); return(-1); } を省略しました。
お礼
回答ありがとうございます。 サイズ0でした。 この問題が起きるちょっと前に ,"w"と,"r"を一回間違えてたことを思い出しました。 あと、 サイズ0のファイルでもfseekってできるんですね。 お騒がせしました。