• ベストアンサー

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

ファイルポインタが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); } を省略しました。

関連するQ&A

  • ファイル処理について

    大学の課題なのですが、何度取り組んでもエラーになるため、間違いのご指摘、または正答を教えていただけないでしょうか。 問題は以下のものです。 【問題】 ファイルから整数を読み込み,その値によってfpの読み込み位置をかえ,何度目の読み込みで0を読み込んだかを表示するプログラムを作成せよ. ファイルの内容の例 2,4,0, fpの読み込み位置を変えるにはfseekという関数を利用する. fseekの使い方: 現在の読み取り位置xだけずらすには, fseek(ファイルポインタ, x, SEEK_CUR); と記述する. STEP 1 データを一区切りで読み取る("2,"や"-4,"などの整数とコンマの組) 2 読み取ったデータに応じてfpを移動させる("2,"なら2移動,"-4,"なら-4移動) 3 0を読むまで繰り返す +++++*+++++fseek-exercise.c+++++*+++++ #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // (* ここに解答を書き加える *) while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // (* ここに解答を書き加える *) printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // (* ここに解答を書き加える *) } printf("%d回目です.",count); fclose(fp); return(0); } // 以上になります。 自分で作ったプログラムは以下のようになりました。 #include <stdio.h> int main(void){ FILE *fp; int c; int i; int count=0; char filename[60]; printf("ファイル名 :"); scanf("%s",filename); //ファイルを開く // fp = fopen(filename,"r"); if(fp == NULL){ printf("cannot open\n"); exit(1); } while(1){ printf("読み込み前 : %ld\n",ftell(fp)); //fpから値を読む // c = fgetc(fp); printf("読み込んだ値は%dです\n",c); printf("読み込み後 : %ld\n\n",ftell(fp)); //読み込み位置をずらす // if(c > '0' || c< '9'){ i = atoi(&c); count++; if(i == 0){ break; } fseek(fp,i,SEEK_CUR); } } printf("%d回目です.",count); fclose(fp); return(0); } // どこを訂正していいのかわかりません。 どうぞ、よろしくお願いいたします。

  • ファイルサイズの取得について

    2つのテキストファイルのサイズを取得し、そのファイルサイズ分だけを動的にメモリを確保しようとしています。 int *c,*a;と宣言し、 fp=fopen("./data/Problem.txt","r");//1つ目のファイル fseek(fp, 0, SEEK_END); /* ファイルの終端までシーク */ size = ftell(fp); /* 終端の位置、すなわちファイルサイズを得る */ fseek(fp, 0, SEEK_SET); /* ファイルの先頭に戻る */ c = (int *)malloc(size); /* ファイルサイズ分メモリ確保 */ while((x=fgetc(fp))!=EOF){ c[i]=x; i++; } c[i]='\0'; i=0; fclose(fp); fpa=fopen("./data/Answer.txt","r");//2つ目のファイル fseek(fpa, 0, SEEK_END); size = ftell(fpa); fseek(fpa, 0, SEEK_SET); a = (int *)malloc(size); while((x=fgetc(fpa))!=EOF){ a[n]=x; n++; } a[n]='\0';//・・・・(1) n=0; fclose(fpa); とすると1つ目のファイルの方だけはうまくいくのですが、(1)の部分で 「sample.exeの0x00411dcでハンドルされていない例外が発生しました:0xc0000005:場所0x0000000に書き込み中にアクセス違反が発生しました。。」 というエラーが出ます。 また、 int *c,*a;を int *c,a[300]; のように片方を配列として宣言し、 //a = (int *)malloc(size); /* ファイルサイズ分メモリ確保 */ のようにコメントアウトすると上記のエラーは出ずにcにメモリは確保されているようです。 これは何故なのでしょうか? また、どうすればaとcでメモリを確保出来るようになるのでしょうか? よろしくお願いいたします。

  • バイナリファイルの読み込み(C言語)

    raw(音楽ファイル)データを配列rawに読み込みたいのですが,バイナリファイルの読み込み方がわかりません. サンプルで以下のようなソース(途中略)があるのですが, ・なぜrawの型としてshortを使っているのか ・データ数の半分(file_size = ftell(fp) / 2)しか読み込んでいない ・fgetc(fp) << 8 あたりの意味がわからないので教えて下さい. -------------------------------------------------------- short *raw; if((fp=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "can't open %s.\n", argv[1]); exit(1); } fseek(fp, 0, SEEK_END); file_size = ftell(fp) / 2; fseek(fp, 0, SEEK_SET); raw = (short *)malloc((size_t)(file_size * sizeof(short))); if(raw == NULL){ fprintf(stderr, "malloc error\n"); exit(1); } for(i=0;i<file_size;i++) raw[i] = (short)((fgetc(fp) << 8) | fgetc(fp)); -----------------------------------------------------

  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP
  • fwriteで書き込み

    やりたいことは・・・下に書いていきます。 何がおかしいのか教えてください。 $fp = fopen("example.txt", "r+"); fopenでexample.txtを読み書き可能で開きます。 返り値はポインタですよね。 $fseek = fseek($fp, -3, SEEK_END); $fpで開いたexample.txtのポインタを、ファイルの最後尾から3バイト戻したつもりです。 返り値は 0 成功 -1 失敗 $ftell = ftell($fp); で、今のポインタの位置を確認します。 返り値はポインタ。 fwrite($ftell,$write); $writeの内容を、example.txtの最後から3バイト戻ったところへ書き込み・・・のつもりなのですが。 専門分野ではありませんので、調べてもなかなか進まないです。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • ポインターについて

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2352832 で、質問させて頂いた者です。 ポインターの使い方について 理解できないところがありましたので 新しく質問をさせて頂きました。 ----------- ↓構造体の型を宣言しています typedef struct douken_ { char tiku[11]; char ken[9]; } douken; int main(void){ FILE *fp; ↓変数を宣言 douken dou [100]; ・ ・ ・ while (fgets(buff,sizeof buff,fp) != NULL){ ファイルから読み込んだデータを構造体に格納 memcpy(&dou[i].tiku ,buff,10); memcpy(&dou[i].ken ,buff+10,10); 【ここが問題】 現データと全データを比較する if (strcmp(dou[i].tiku , dou[i-1].tiku)){ ----------- if文で現データと全データを比較する時に、 実数だと正常に動くのですが ポインターで指定すると 警告が出てしまいます。 if (strcmp(&dou[i].tiku , &dou[i-1].tiku)){ とすると >警告 W8075 kadai3-2.c 33: 問題のあるポインタの変換(関数 main ) という警告が出てしまうのです。 どうしてポインターで指定すると 警告が出るのかが分からないのです。 (memcpyではファイルから読み込んだデータを 構造体に格納するときはポインターで指定しているのに…) ご教授して頂けたら幸いです。

  • C言語のローカル変数の使い方について質問です。

    C言語の変数に関しての質問です。 グローバル変数を使わずに、関数内で宣言したローカルの変数を別のソースファイルで使用することって可能ですか? 例えば、a.cというソースファイルと、b.cというソースファイルがあります。 a.cの関数内で"FILE *fp;"と宣言したローカル変数を、b.cの関数内で共有して使うことはできるのでしょうか。 また、"fp"に直接アクセスはできなくても、間接的にアクセスできる方法があれば教えてください。 下に記述しているのは例え用に適当に書いたプログラムです。 --------------------- a.cのソースファイル --------------------- void Temp(void) { char file_name[128] = {}; errno_t error; FILE *fp; // ←この変数を別のソースで使いたいです scnaf_s("%s", file_name, 128); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません"); return 0; } fclose(fp); } --------------------- b.cのソースファイル --------------------- void Temp2(void) { int size; // ここでa.cのTemp関数で宣言されている"fp"を使いたい fseek( fp, 0, SEEK_END ); fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); }

  • ポインタのsizeofについて

    C初心者です。 ポインタ宣言させた変数をsizeof()で値を取得させて 表示させてみました。 char *cp; short int *sp; int *ip; i = sizeof(cp); printf("%d\n",i); i = sizeof(sp); printf("%d\n",i); i = sizeof(ip); printf("%d\n",i); 結果は全て4となりました。 これはなぜですか? (ただの変数として宣言すれば1、2、4となります。この理由も理解できています。)

  • VisualC++でのバイナリファイル

    VisualC++でのバイナリファイルのサイズの取得。 Win7 x64 VC++2012 調べた所によると、 バイナリモードではNULL文字を使用できるため、 FILE* fp; fopen_s(&fp,"data.bin","rb"); fseek(fp,0,SEEK_END); size_t fsize=ftell(fp_cl); //fseek(fp,0L,SEEK_SET);//元の位置に戻す。 fclose( fp ); のような感じでサイズを取得してはいけない。 (fseekのSEEK_END動作が不定のため) ……と思っていたのですが、他に方法と言えば、 ファイルを一度全て空読みするくらいしかないので、 試にやってみたところ、上手く行ってしまいます。 一応NULLの入ったバイナリでも正しく取得できてしまいました。 これはCの仕様が変わったためなのか、VC++がたまたま対応しているのか、 どちらでしょうか? また、他に上手い方法があればよろしくお願いいたします。

  • csvファイルの読み込み

    fscanf関数を用いて、csvファイルの内容を構造体のそれぞれのメンバに読み込んで表示させようとしているのですが、4列目以降が上手く読み込めません。初歩的な質問で申し訳ありませんがどなたか教えてください。 ****************************ソース************************************************ #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME "view_001_McdlData.csv" #define FILE_SIZE 819200 struct Data{ int DataNo; int FrameNo; int SampleNo; char Digital; double voltage; double trigger; double C; double D; }; int main(int argc, char *argv[]) { FILE* fp,*fo, *fi; // ファイルポインタ用 int n, i, file_size; double time,vel[FILE_SIZE]; struct Data *dat; char buff[SIZE]; if ((fp = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; //データの読み込み while((fscanf(fp, "%d,%d,%d,%s,%lf,%lf,%lf,%lf",&dat[i].DataNo,&dat[i].FrameNo,&dat[i].SampleNo,&dat[i].Digital,&dat[i].voltage,&dat[i].trigger,&dat[i].C,&dat[i].D)) !=EOF ){ printf("%d %d %d %s %lf %lf %lf %lf\n",dat[i].DataNo,dat[i].FrameNo,dat[i].SampleNo,dat[i].Digital,dat[i].voltage,dat[i].trigger,dat[i].C,dat[i].D); i++; } fclose(fp); return 0; } ***********************************csvファイルの内容************************************ 0,1,0,0x3F,2.270000,0.000000,-1.000000,-1.000000 1,1,1,0x3F,2.260000,0.010000,-1.000000,-1.000000 2,1,2,0x3F,2.260000,0.010000,-1.000000,-1.000000 3,1,3,0x3F,2.260000,0.010000,-1.000000,-1.000000 4,1,4,0x3F,2.260000,0.010000,-1.000000,-1.000000 5,1,5,0x3F,2.260000,0.000000,-1.000000,-1.000000 ***************************************************************************************************

専門家に質問してみよう