
こんにちは。
関数内で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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(クラウドサービス・オンラインストレージ) Google ColabでGoogleドライブのサブフォルダにファイルを生成する方法 1 2022/10/31 17:37
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
[C言語 Windows] Visual Cでの...
-
受信データから必要な部分のみ...
-
char型2つを結合し、short型に...
-
構造体メンバの初期化
-
C言語でのCSVファイルの読み出...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
reallocでエラー
-
【C言語】全角文字の配列を、全...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
2進数、16進数、10進数のことを...
-
複数桁10進数の*桁目だけを抽出...
-
エクセルで可視セルにのみ値貼...
-
20'(角度)の計算がわかりま...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
printf による16進表示について
-
C言語で複数列のデータを1列の...
-
空白を含んだ文字列がうまく格...
-
char型2つを結合し、short型に...
-
C++で指定文字列のカウント方法...
-
reallocでエラー
-
C言語でのCSVファイルの読み出...
-
Ç言語でファイルサイズを変更す...
-
ビルドエラーの対処がわからな...
-
WinInetのInternetOpenUrl関数...
-
結果をファイルにちゃんと保存...
-
警告 W8075 問題のあるポインタ...
-
エラーについて質問です。
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
HANDLEのエラー
-
ビット演算について
おすすめ情報