
こんにちは。
関数内で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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
処理系によって。
-
なぜ無限ループになるかが分か...
-
setjmp・longjmpに関しまして
-
c言語 プログラム
-
fwrite処理について
-
C言語のシリアル通信について
-
C メモリの解放について
-
【C言語】全角文字の配列を、全...
-
困ってます!書き方がわかりま...
-
char型2つを結合し、short型に...
-
文字列の入力
-
コマンドファイルから、ビット...
-
NetBIOS名のエラー
-
プログラミングの授業の課題です
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
整定時間
-
Visual C++ フレームを中央に表...
-
作成したいプルグラムがあります。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
printf による16進表示について
-
reallocでエラー
-
構造体メンバの初期化
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
char型2つを結合し、short型に...
-
C言語のシリアル通信について
-
構造体の配列のアロケート等の方法
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
エラーについて質問です。
-
WinInetのInternetOpenUrl関数...
-
警告 W8075 問題のあるポインタ...
-
C++で指定文字列のカウント方法...
-
ごみが入りますか?
-
ファイルを辞書順に並べ替える...
-
ファイル入力のエラー
おすすめ情報