• ベストアンサー

fgets の失敗時、再読み込み開始位置は?

こんにちは。 fgets の失敗時、再読み込み開始位置はどこになるのでしょうか? 例えば、以下点線内のファイルを読み込み、bを読み込めずに失敗した場合 再度 fgets を発行(以下★)した場合、得られる文字列はどれでしょうか? (EOFまで読み込み NULL で返却されることは考えないとします) ----- a b c ----- if( fgets( line, 100, stream ) == NULL)  fgets( line, 100, stream ) ★ 元々CStdioFile クラスの ReadString メソッドで CFileException がスローされた場合の再読み込み処理を 調べていたのですが、ReadString メソッド内部では fgets をコールしていたので質問させていただきました。 よろしくお願いします。 Windows XP VC++6.0

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

ISO/IEC9899を見ると、「lineが不定なこと」は明記されていますが、 読み込み位置には言及されていない。 規格に定義がない⇒undefined behaviorでは。 # 特定処理系に付属の、特定処理系専用ライブラリが、 # 特定の処理系でしか保証されない内部コードを持っていても、 # 驚くには値しないと思います。 # (そうでもないと標準ライブラリからして実装できない)

その他の回答 (2)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

エラーフラグを落とすのは前提じゃないんですかね。 # VC7.1SP1のCStdioFile::ReadStringは例外を投げる前にclearerr読んでます。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

http://msdn.microsoft.com/library/ja/vclib/html/_CRT_clearerr.asp MSDNのこの辺の記述を見た感じだと、 いったん読み込みに失敗したら、その後は何度やっても失敗するような気がする。

関連するQ&A

  • fgetsの処理を詳しく説明してください、お願いします。

    char line[100]; (stream = fopen( "test.c", "r" )) == NULL; while( ( fgets( line, 100, stream ) != NULL)){ printf( "%s", line); } fclose( stream ); 上記のコードでファイルが一行ずつ表示されるのですがなんとなくでfgetsを使っていたのでwhile文中のfgetsの動きがよく分かりません。 初めに改行文字までの一行を読み込むのはわかるのですが、何故繰り返すときlineに2行目、3行目、・・・ と取り込むのかがわかりません。 よろしくお願いします。

  • fgets関数のEOFの扱い方について

    fgets関数のEOFの扱い方って、 ファイルの終わり(EOF)を検出し、かつ配列に1文字も読み取れなかった場合、配列の内容を変化させずに残しNULLを返す。配列に1文字以上読み取れた場合、EOFをバッファに残し配列に'\0' を追加する。その後、EOFを読み取り終了。 であってますか?

  • fgetsのエラー

    C言語でテキストファイルをfgetsで読み込み、for文でfgetsを繰り返しているのですが、テキストファイルの15003行目でfgetsのエラーが出てしまい、止まってしまいます。 20000行まで読み込みたいのですが出来ません。 繰り返しが悪いのかと思い、for文を(i=0;i<10000;i++)と(i=10000;i<20000;i++)で分けても読み込んでも同じ結果でした。 テキストファイルが13880行までの場合はうまくいきました。 ↓Cプログラム↓ FILE *fpo; char line[4096]; for (i=0; i<20000; i++) { if (fgets(line, sizeof(line), fpo) == NULL) return(0); sscanf(line, "%d %lf %lf %lf %lf %lf %lf", &typep[i], &x[0][i], &x[1][i], &v[0][i], &v[1][i],&p[i], &n[i]);    //lineのデータを1つ1つ読み込む } ↓エラー文↓ Debug Assertion Failed! File: f:\dd\vctools\crt_bld\self_x86\crt\src\fgets.c Line:57 Expression:(str!=NULL) なにが原因なのか分かりません。 よろしくお願いします。

  • fgetsなどをもちいて「改ページ」までの文字列を読み込みたい

    ファイルから1行ずつデータを読み込んで処理をするプログラムを書いています。 現在はfgets関数を用いて FILE *stream; char line[100]; ~ fgets(line, 100, stream); という風に1行ずつ読み込んでいるのですが、この方法だと、改行は認識できても、「改ページ」は認識できず、改ページも行中の文字だと認識して続きを読み込んでいってしまいます。 たとえば あいうえお[改ページ] かきくけこ[改行] さしすせそ[改行] というファイルであった場合、 line配列には「あいうえお[改ページ]かきくけこ」と読み込まれてしまいます。 本当は 1回目で「あいうえお」、2回目で「かきくけこ」と読み込むようにしたいのですが、このような読み込み方はどのようにすればいいのでしょうか。 一度とりあえず改ページコードごと読み込んで、1文字ずつチェックして・・・という手作業をするしかないのでしょうか? いい方法がありましたら教えてください。

  • fgetsについて

    こんにちは。こちらのカテゴリには初めての投稿です。よろしくお願いします。 C++を用いて、Fedora上で"tcp dump"コマンドを実行し、1秒ごとのeth0(NIC)を通過したackパケットを記録するプログラムを作成しています。(150秒分記録) ソースコードは質問文最後に記載します。 質問は、下記のプログラムでtcpdumpから1行分実行結果を取り出す際に使用しているfgets関数についてです。 調べてみると、fgtes関数は失敗した際は、NULLを返し「停止」するとあります。 http://www.nxmnpg.com/ja/3/fgets これがおそらく原因かと思いますが、何も通信が行われていない状況で実行すると、 temp = fgets(buf,150,pp); の行でプログラムが止まってしまいます。(何かしら通信がある(パケットが通る)と再開します) よって、正確な時間計測ができず、困っています。 私はC++を勉強したてで、あまり読みやすいプログラムではないと思います。申し訳ありません。 fgetsの代わりになるような関数、または方法はありませんでしょうか。 ご回答、よろしくお願い致します。 //num_ack[]に各秒におけるパケット数を記録します。 //教えてgooの仕様上、tabや半角スペースが使えないので行頭のスペースはすべて全角です。ご了承ください。 #include <iostream> #include <stdlib.h> #include <time.h> #include <string.h> using namespace std; #define N 150 int main() {    time_t start,end;    int num_ack[N];    int i=0;    char buf[150];    char *src,*temp,*srcstr;    char cmp[150];    srcstr = "ack"; //検索ワード:"ack"    FILE *pp;    pp = popen("tcpdump -i eth0","r");    //popen失敗検知    if(pp == NULL)    {       cout << "tcpdump failed" << endl;       exit(EXIT_FAILURE);    }    for(int k=0;k<N;k++) //num_ackを初期化    {       num_ack[k] = 0;    }    while(1)    {       start = time(NULL);       end = time(NULL);       while((int)(end - start) <1) //1秒間計測       {          temp = fgets(buf,150,pp); //tcpdumpから1行(1パケット分)をbufへ取得          src = strstr(buf,srcstr); //bufから、"ack"を検索          if(src != NULL && strcmp(buf,cmp) !=0) //検索結果がNULLでなく、前回から変更がある場合          {             num_ack[i] += 1;             strcpy(cmp,buf);          }          end = time(NULL);       }       j += 1;    }    pclose(pp);    return num_ack; }

  • c言語のscanfとfgetsについて

    2つの単語A, Bを入力して、AがBに含まれるか否かというプログラムで 以下のようなものを作成しました。 そこで質問なのですがscanf()をfgets()に変えるとうまく動作しません どこが間違ってますか? 変更したいfgets fgets(key, sizeof(key), stdin); fgets(word, sizeof(word), stdin); ------------------------------------------------- int main(void) { char key[101], word[101]; scanf("%s", key); scanf("%*c%s", word); if (strstr(word, key) != NULL) { printf("Find %s In %s\n", key, word); } else { printf("Not Find\n"); } return 0; }

  • C言語におけるfgetsを用いたループ処理について

    C言語において、文章を読み込むためにfgetsを用いて下記のプログラムを書いたのですが、*において入力を受け付けなくなります。 これを解消する方法はないでしょうか? ちなみにコンパイラはBBC、開発環境はVistaです。 なお、簡略のため#include,main等は省略しています。 //以下プログラム #define SIZE 16384 char moji[SIZE] = {""}; char buf[SIZE]; //EOF(^Z)になるまで、文字列を受け取る while(fgets(buf, sizeof(buf), stdin) != NULL){ if(sizeof(moji) < strlen(moji) + strlen(buf)) break; strcat(moji, buf); }; getchar(); //* //プログラムここまで

  • 初心者です。WINAPIでの文字列の取り込みについて

    今 if((stream=fopen("words.txt","r"))==NULL){ return 1; } while((fgets(line,256,stream))!=NULL){ ・ wsprintf(mon, "表示:\"%s\"", line); ・ のようにしてファイルから一行ずつ取り込んでいるのですが, TextOut(hdc, 0, 0, mon, (int)mon()); 表示されるのが 表示:"see↑"(最後に半角の↑見たいな物が入ってるのですがなんなのでしょうか? また"see"だけなどを格納するにはどうすればいいのでしょうか教えて下さい。

  • fgets で値が取得できない

    fopen , fgets に関して質問させてください。 現在「readme」というファイルを UTF-8 にて開こうとしております。 fopen でファイルは開けているようなのですが、fgets を呼び出した際に以下の様なメッセージが出て異常終了してしまいます。 『Microsoft Visual Studio C ランタイム ライブラリは Sample.exe に致命的なエラーを検出しました。 [中断] をクリックしてプログラムをデバッグするか、または [続行] をクリックしてプログラムを終了してください。』 UTF-8 を指定しない場合は上手く動いているようです。 UTF-8 の時は特殊な取り出し方をしなければならないのでしょうか? Visual C++ 2008 Express Edhition の デバックモードで動かしています。 ****************************** 1 : FILE *file1; 2 : char s[256]; 3 : 4 : file1 = fopen( "C:\\readme", "r, ccs=UTF-8"); 5 : while (fgets(s, 256, file1) != NULL) 6 : { 7 : printf("%s", s); 8 : } ******************************

  • 途中にEOFがあるファイルの読込

    VB6でファイルを全行読み込んで任意の処理を行いたいのですが、そのファイルには 途中に文字コード 1a (つまりEOF)が入っている場合があります。 普通に Line Input で処理すると、その部分でファイル終了と判断し 読込を終えてしまいますが、その後のデータも読み込みたいのです。 どのようにすれば良いのでしょうか?

専門家に質問してみよう