- ベストアンサー
fgetsの使い方
C言語を今日から始めたじいさんです。 宜しくお願い致します。 メモ帳を使って3行ほどの文字列を入力して、text.txtファイルに保存します。 この文字列を読み込んで、1行ずつ印刷しようとしていますが fgetsでtxtファイルの終了条件がわかりません。 while(fgets(row , sizeof( row ) , fp) != NULL){ printf("%s\n , row); } fclose( fp ); return 0; のようにしているのですが、3行印字処理をして異常終了してしまいます。 本に出ている例をそのまま実行しているのですが、うまくいきません。 txtファイルをダンプしてみると各行の後ろに0d 0aたぶんCR,LFが入っていてNULL=00(?)はありません。テキストファイルの作り方に問題があるのでしょうか? それともfgetsの使い方に誤りがあるのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
txtファイルの3行目の次が空行(改行だけの行)になっていないですか? 3行目の終わりのCRLFの次にもうひとつのCRLFがないか、ダンプで確認してみて下さい。
その他の回答 (6)
- asuncion
- ベストアンサー率33% (2127/6289)
>実際のファイルはカンマであることを確認しました。 ということは、データファイルの内容は正しいが、 #3さんの回答への補足で提示されたソースコードだと 実行時に落ちてしまうということですか?
補足
データが画面に出力され [NULL] が最後に出力されて 「問題が発生しました・・・・」 になってしまいます。
- asuncion
- ベストアンサー率33% (2127/6289)
今回の件の原因は、#4さんの回答のとおり、データファイルの形式に問題があったためです。 それはさておき、 >実際はこのようなソースコードになっています。 何だか小出しにされると、困ってしまうのです。 じゃあ、最初に提示されたソースコードは何だったの?それに対する回答はムダだったの?という話です。
補足
申し訳ございませんでした。 初めてのC言語で、変なコメント等をたくさん入れていたので、 わかりやすくしようとしてかえっておかしくしてしまいました。
- burroughs6
- ベストアンサー率76% (29/38)
>001,aiueo.05 >003,sasisuseso.55 名前と年齢の区切りがカンマ","ではないですが。
補足
コピペすれば良かったですね。 新たに入力したので間違えてしまいました。 実際のファイルはカンマであることを確認しました。 どうもすいませんでした。
- D-Matsu
- ベストアンサー率45% (1080/2394)
fgets()は「読み込むものが無い」、つまりファイル終端に辿り着いたらNULLを返します。 ぱっと見では(#2で修正されてる部分はともかくとして)コード自体に問題はないと思いますが、どのようなtext.txtを読んだらどのように異常が発生しましたか?
補足
テキストファイルはメモ帳を使って以下のような文字列を入力しています。 001,aiueo.05 002,kakikukeko,99 003,sasisuseso.55 実際のソースコードは #include <stdio.h> #include <string.h> typedef struct list{ char id[3+1]; char name[10+1]; char age[2+1]; }list; int main(void) { list lists[100]; FILE *fp; char row[20]; char *p; int i=0; fp = fopen("./test.txt","r"); if(fp == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } else{ printf("ファイルをオープンしました。\n"); } while(fgets(row, sizeof(row), fp) != NULL){ p = strtok(row, ","); printf("%s\n",p); strcpy(lists[i].id, p); p = strtok(NULL, ","); printf("%s\n",p); strcpy(lists[i].name, p); p = strtok(NULL, ","); printf("%s\n",p); strcpy(lists[i].age, p); i++; } fclose(fp); return 0; エラーメッセージは 「問題が発生したため、xxx.exeを終了します。ご不便をおかけして申し訳ありません」
- asuncion
- ベストアンサー率33% (2127/6289)
ご提示くださったソースコードには、 >while(fgets(row , sizeof( row ) , fp) != NULL){ 全角の{ を使っている >printf("%s\n , row); " の対応が取れていない というエラーがありました。これらを修正した下記のコードを使って、 aaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccccccccc という内容のtest.textを読込むと、当方の環境では想定どおりの結果を得ました。 お使いの入力ファイルの1行の長さが配列の定義範囲を超えている、というようなことはありませんか? #include <stdio.h> int main(void) { FILE *fp; char row[24]; fp = fopen("./test.text", "r"); if (fp == NULL) { printf("ファイルオープンエラー\n"); return -1; } while (fgets(row, sizeof(row), fp) != NULL) { printf("%s\n", row); } fclose(fp); return 0; }
補足
申し訳ございません。 実際はこのようなソースコードになっています。 test.txt 001,aiueo.05 002,kakikukeko,99 003,sasisuseso.55 #include <stdio.h> #include <string.h> typedef struct list{ char id[3+1]; char name[10+1]; char age[2+1]; }list; int main(void) { list lists[100]; FILE *fp; char row[20]; char *p; int i=0; fp = fopen("./test.txt","r"); if(fp == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } else{ printf("ファイルをオープンしました。\n"); } while(fgets(row, sizeof(row), fp) != NULL){ p = strtok(row, ","); printf("%s\n",p); strcpy(lists[i].id, p); p = strtok(NULL, ","); printf("%s\n",p); strcpy(lists[i].name, p); p = strtok(NULL, ","); printf("%s\n",p); strcpy(lists[i].age, p); i++; } fclose(fp); return 0;
- asuncion
- ベストアンサー率33% (2127/6289)
ソースコードを、全部見せていただけますか? 断片だけを見ても、原因や対策がわからないことがあります。
補足
以下のようなプログラムです。 #include <stdio.h> #include <string.h> int main(void) { FILE *fp; char row[24]; fp=fopen("./test.text","r"); if(fp==NULL){ printf("ファイルオープンエラー\n"); return -1; } while(fgets(row , sizeof( row ) , fp) != NULL){ printf("%s\n , row); } fclose( fp ); return 0;
お礼
0d 0aがCR,LFならば、3行目の終わりの0d 0aのみで もうひとつの0d 0aはありませんでした。 ダンプからすると変なコード等は一切はいっていないのですが、 もう一度、作成しなおしてみたら動いてしまいました。 正常に動いたファイルのダンプと全く同じなのですが??? これ以上は初心者なのでギブアップです。 色々とアドバイス頂き有難う御座いました。