![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
こんにちは。
関数内でCSVファイルからデータを読み取り、そのデータをリストに入れて、先頭を指すポインタをmain内に返すと言う作業をさせたくて書いたソースです。なぜ無限ループするのか分かりません。
どなたか教えていただけませんか?
以下ソース
#include <stdio.h>
#include <stdlib.h>
struct account{
int ID;
char Sname[50];
char Fname[50];
char Adress[100];
int Sex;
int Age;
char Group[100];
struct account *next;
};
struct account *Rfile(char *FileName,struct account *top);
int main(void)
{
char FileName[FILENAME_MAX];
struct account *top,*q;
top = NULL;
printf("読み込むファイルの名前を入力してください>>>");
scanf("%s",FileName);
q = Rfile(FileName,top);
return 0;
}
struct account *Rfile(char *FileName,struct account *top)
{
FILE *fp;
char filename[FILENAME_MAX];
int ret;
struct account *new;
new = (struct account *) malloc(sizeof(struct account));
new->next = NULL;
strcpy(filename,FileName);
if( (fp = fopen( filename,"r")) == NULL)
{
printf("ファイルが見つかりません。>>>%s\n",filename);
//exit(EXIT_FILURE);
}
while( (ret = fscanf( fp, "%d,%[^,],%[^,],%[^,],%d,%d,%[^,]", &(new->ID), new->Sname, new->Fname, new->Adress, &(new->Sex), &(new->Age), new->Group ) ) != EOF )//ファイルの最後でないなら
{
printf("%d,%s,%s,%s,%d,%d,%s",new->ID,new->Sname,new->Fname,new->Adress,new->Sex,new->Age,new->Group);
if(top != NULL){
while(top->next != NULL){
top = top->next;
}
top = new;
}
else{//top == NULL
top = new;
}
new = NULL;
new = (struct account *) malloc(sizeof(struct account));
new->next = NULL;
}
fclose(fp);
return top;
}
No.1ベストアンサー
- 回答日時:
実際にドコで無限ループしているのかは不明ですが…
>printf("読み込むファイルの名前を入力してください>>>");
>scanf("%s",FileName);
バッファオーバーフロー可能です。
>q = Rfile(FileName,top);
topが無駄です。
>strcpy(filename,FileName);
filenameが無駄です。
>while( (ret = fscanf( fp, "%d,%[^,],%[^,],%[^,],%d,%d,%[^,]", &(new->ID), new->Sname, new->Fname, new->Adress, &(new->Sex), &(new->Age), new->Group ) ) != EOF )//ファイルの最後でないなら
fscanf()で指定している書式と違うモノが入った場合、予想しない挙動になるかもしれませんが…そのヘンは大丈夫ですか?
# ここでのエラーによりfscanf()が進まなくてEOFに届かない…のかな?
fgets()で取り込んで自分で解析処理する(もちろんエラー処理も)とか、
同じくfgets()で読み込んでからsscanf()に渡す。とか…エラー処理は考慮した方がいいでしょう。
>while(top->next != NULL){
>top = top->next;
>}
>top = new;
最終的にtopが書き換えられます。
よって、本当の意味での先頭を保持している変数が居なくなり…ませんか?
リスト構造の扱いに関して、理解が足りていない…と思われます。
各変数がドコを指しているのか?という点には注意された方がいいでしょう。
あと…
[技術者向] コンピューター > プログラミング > C&C++
というカテゴリがありますから、そちらの方が適切でしょう。
無事に完成させることができました!
ご指摘のようにリスト構造の理解が足りていない事も身にしみて実感することができました。
とても丁寧にソースを見て指摘いただき大変助かりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
ビルドエラーの対処がわからな...
-
char型2つを結合し、short型に...
-
fatal error LNK1120: 外部参照...
-
reallocでエラー
-
2÷3などの余りについて
-
C言語での引数の省略方法
-
マイナスからプラスへ転じた時...
-
Aの値からBの値を除するとは??
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
「Aに対するBの割合」と「Aに対...
-
DWORDの実際の型は何でしょうか
-
正負を反転させて出力するプロ...
-
20'(角度)の計算がわかりま...
-
コンパイルエラーについて
-
for文の中にswitch文はいれられ...
-
ラップ関数とはどんなものですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
C言語のプログラムで、途中で止...
-
reallocでエラー
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
VC++でSQLへSELECT文を送ったの...
-
C言語でのCSVファイルの読み出...
-
エラーについて質問です。
-
矢印キーを押下してコンソール...
-
setjmp・longjmpに関しまして
-
タイムカードのシステムを作り...
-
大量のファイルを読み込み、そ...
-
Cでファイルの行数をカウントす...
-
受信データから必要な部分のみ...
-
C言語、ファイル操作、fgets()...
おすすめ情報