プロが教える店舗&オフィスのセキュリティ対策術

ファイルポインタが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とか)を使うとファイルポインタは動きます。
お願いします。

A 回答 (10件)

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

つまり、ファイル名の指定に失敗しているのでは?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

サイズ0でした。

この問題が起きるちょっと前に
,"w"と,"r"を一回間違えてたことを思い出しました。

あと、
サイズ0のファイルでもfseekってできるんですね。

お騒がせしました。

お礼日時:2002/06/29 11:52

fgetc() の後に ungetc() でストリームに文字を


返してしまっていれば、ストリームポジションは
移動しません。しかし、そんなイレギュラーなことを
するとも思えません。

ファイルポインタが移動しないという障害状況が
起こったなら、いかにして起こったのかということに
こちらもちょっと興味があります。勘違いだったと
しても、そういった誤解の起こりやすい状況というのを
後学の為に知りたいというのもあるので、もしまだ
未解決なのであれば、なんとかソースの抜粋を載せて
みることはならんでしょうか?どんな感じか知りたいす。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

サイズ0でした。

この問題が起きるちょっと前に
,"w"と,"r"を一回間違えてたことを思い出しました。

あと、
サイズ0のファイルでもfseekってできるんですね。

お騒がせしました。

お礼日時:2002/06/29 11:59

既に回答されていますが、


> static FILE fp1;
static FILE *fp1;
とされているのでしょうか?
    • good
    • 0
この回答へのお礼

>> static FILE fp1;
>static FILE *fp1

大丈夫です。^^;

お礼日時:2002/06/29 11:54

#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);
}

これでも動きませんか?(思いっきり省略してるけど)
    • good
    • 0

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

    • good
    • 0

プログラムをすべて貼り付けたほうがいいのではないでしょうか。


すくなくとも、問題の for 文のある関数を書かなければ、回答が出ないと思いますよ。
    • good
    • 0
この回答へのお礼

回答ありがうございます。
>プログラムをすべて貼り付けたほうがいいのではないでしょうか。
え~
私もそうしたいのですが全部書くとものすごい量になってしますので・・・

私が尋ねたいことはfget関数を使ってもファイルポインタが
動かないことがありえるのかどうか
と、
もしありえるとすればどういったパターンの時か

です。
お答えしづらいとは思いますがお願いします。

お礼日時:2002/06/28 08:53

freadなどでもファイルポインタは動きませんか?



とりあえずファイル操作関数を使用しているすべてのところで
エラーチェックをしてみたらどうですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

サイズ0でした。

この問題が起きるちょっと前に
,"w"と,"r"を一回間違えてたことを思い出しました。

あと、
サイズ0のファイルでもfseekってできるんですね。

お騒がせしました。

お礼日時:2002/06/29 11:56

>ただ、質問の趣旨とはちょっと・・・


えーっと、質問の回答としては 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" は意味がありません。#これも質問とは関係ありませんね、すいません。
    • good
    • 0

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関数は結果が合わないから導入したものです。
ファイルポインタが動いていないのは確かです。

補足日時:2002/06/27 18:11
    • good
    • 0

> static FILE fp1;


FILE* です。

>fopen(.....);
fp1 = fopen (.....);

とりあえず気がついたところだけです。
    • good
    • 0
この回答へのお礼

コメントありがとうございます。
ただ、質問の趣旨とはちょっと・・・

if((fp1=fopen(("%s",argv[1]),"r"))==NULL){
puts("オープンエラー\n");
return(-1);
}
を省略しました。

お礼日時:2002/06/27 17:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!