dポイントプレゼントキャンペーン実施中!

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の使い方に誤りがあるのでしょうか?

A 回答 (7件)

txtファイルの3行目の次が空行(改行だけの行)になっていないですか?



3行目の終わりのCRLFの次にもうひとつのCRLFがないか、ダンプで確認してみて下さい。
    • good
    • 0
この回答へのお礼

0d 0aがCR,LFならば、3行目の終わりの0d 0aのみで
もうひとつの0d 0aはありませんでした。
ダンプからすると変なコード等は一切はいっていないのですが、
もう一度、作成しなおしてみたら動いてしまいました。
正常に動いたファイルのダンプと全く同じなのですが???

これ以上は初心者なのでギブアップです。
色々とアドバイス頂き有難う御座いました。

お礼日時:2009/05/24 00:38

>実際のファイルはカンマであることを確認しました。



ということは、データファイルの内容は正しいが、
#3さんの回答への補足で提示されたソースコードだと
実行時に落ちてしまうということですか?

この回答への補足

データが画面に出力され
[NULL]
が最後に出力されて
「問題が発生しました・・・・」
になってしまいます。

補足日時:2009/05/23 23:22
    • good
    • 0

今回の件の原因は、#4さんの回答のとおり、データファイルの形式に問題があったためです。



それはさておき、

>実際はこのようなソースコードになっています。

何だか小出しにされると、困ってしまうのです。
じゃあ、最初に提示されたソースコードは何だったの?それに対する回答はムダだったの?という話です。

この回答への補足

申し訳ございませんでした。
初めてのC言語で、変なコメント等をたくさん入れていたので、
わかりやすくしようとしてかえっておかしくしてしまいました。

補足日時:2009/05/23 23:31
    • good
    • 0

>001,aiueo.05


>003,sasisuseso.55
名前と年齢の区切りがカンマ","ではないですが。

この回答への補足

コピペすれば良かったですね。
新たに入力したので間違えてしまいました。
実際のファイルはカンマであることを確認しました。
どうもすいませんでした。

補足日時:2009/05/23 23:06
    • good
    • 0

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を終了します。ご不便をおかけして申し訳ありません」

補足日時:2009/05/23 22:21
    • good
    • 0

ご提示くださったソースコードには、



>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;

補足日時:2009/05/23 22:09
    • good
    • 0

ソースコードを、全部見せていただけますか?


断片だけを見ても、原因や対策がわからないことがあります。

この回答への補足

以下のようなプログラムです。

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

補足日時:2009/05/23 20:39
    • good
    • 0

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