プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
関数内で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;

}

A 回答 (2件)

実際にドコで無限ループしているのかは不明ですが…



>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++
というカテゴリがありますから、そちらの方が適切でしょう。
    • good
    • 0
この回答へのお礼

無事に完成させることができました!
ご指摘のようにリスト構造の理解が足りていない事も身にしみて実感することができました。
とても丁寧にソースを見て指摘いただき大変助かりました。
ありがとうございました。

お礼日時:2011/06/22 07:37

なんでこんな事このカテゴリーで書いたかな~


それようのカテあるから運営に通知して移動するように書いておく
    • good
    • 0
この回答へのお礼

すいません。初質問だったためにどんなカテゴリがあるかちゃんと把握できていませんでした。お手数掛けました。ありがとうございました。

お礼日時:2011/06/22 07:34

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