前提・実現したいこと
[c言語]csvファイルにカンマ区切りで保存されたデータ(id、氏名、点数)を構造体に保存し、キーボードから入力された閾値:threshold以上の点数を持つ氏名を表示、またテキストファイルに書き込むプログラムを作成したいです。コンパイルは通ったのですが、実行の際に以下のようなエラーが表示されました。
発生している問題・エラーメッセージ
Error
Segmentation fault (core dumped)
該当のソースコード
//以下の3つのファイルに分けています //プロトタイプ宣言や構造体の定義を行うヘッダーファイルstructure.h struct student{ char ID[9]; char name[33]; int score; }; int read_csv(char input_data[49][50]); void init(char input_data[49][50],char set_i[49][9],char set_n[49][33],int set_sc[49],int fin); void co_cont(struct student*,char); void more(struct student*,int,int); //メイン関数 #include<stdio.h> #include<stdlib.h> #include<string.h> #include"structure.h" #include"operation.c" int main(void){ int count=0,threshold; char yn; struct student *ptr; char stu_data[49][50],stu_id[49][9],stu_name[49][33]; int stu_score[49]; count = read_csv(stu_data); ptr = (struct student*)malloc(sizeof(struct student)*count); init(stu_data,stu_id,stu_name,stu_score,count); cp_cont(ptr,stu_id,stu_name,stu_score); while(1){ printf("threshold? > "); scanf("%d",&threshold); more(ptr,threshold,count); printf("end? y/n"); scanf("%c",&yn); if(yn=='y'){ break; } } return 0; } //メイン関数以外の関数を記述したファイルoperation.c int read_csv(char input_data[49][50]){ FILE *fp; int l,d; l = 0; d = 0; fp = fopen("students.csv","r"); if(fp == NULL){ printf("Error\n"); return -1; } while(fgets(input_data[l],50,fp) != NULL){ printf("test1%s\n",input_data[l]); l++; } fclose(fp); return l; } void init(char input_data[49][50],char set_i[49][9],char set_n[49][33],int set_sc[49],int fin){ int i,j,c,t; char con[10]; i = 0; j = 0; t = 0; while(fin != 0){ while(input_data[j][i] != ','){ set_i[j][t] = input_data[j][i]; i++; t++; } i++; set_i[j][t] = '\0'; t= 0; while(input_data[j][i] != ','){ set_n[j][t] = input_data[j][i]; i++; t++; } i++; set_n[j][t] = '\0'; t = 0; while(input_data[j][i] != '\0'){ con[t] = input_data[j][i]; i++; t++; } set_sc[j] = atoi(con); con[0] = '\0'; fin--; j++; i = 0; t = 0; } } void cp_cont(struct student *detail,char id[49][9],char nam[49][33],int sc[49]){ int i,j,c; j = 0; c = 49; detail = NULL; while(c != 0){ strcpy((detail+j)->ID,id[j]); printf("%s ",(detail+j)->ID); strcpy((detail+j)->name,nam[j]); printf("%s ",(detail+j)->name); (detail+j)->score = sc[j]; printf("%d\n",(detail+j)->score); j++; c--; } } void more(struct student *ptr , int threshold , int count){ int i=0; FILE *fp; char filename[50]; printf("file name ? > "); fgets(filename,30,stdin); fp = fopen("filename.txt","w"); while(count != 0){ if(ptr->score >= threshold){ printf("%s\n",(ptr+i)->name); fprintf(fp,"%s,%s,%d\n",(ptr+i)->ID,(ptr+i)->name,(ptr+i)->score); } i++; count--; } }
試したこと
ファイルオープンに失敗しているのでは、とアドバイスをもらい
ファイルオープンから構造体への保存までを教えていただいたプログラムで試しましたが
同じエラーが出てしまいました。
他にどのような問題点が考えられるでしょうか?
自分の実行環境に何か問題があるのでしょうか?
回答してくれる人の中で自分のソースコードで実行出来る方はいませんか?
補足情報(FW/ツールのバージョンなど)
Ubuntuを使用してプログラムを書いています。読み込むためのcsvファイルはデスクトップに置いています。
ごめんなさい、このサイトを使うのは初めてでして、使い方もまだよく分かっていませんでした。codeボタンのことを教えていただきありがとうこざいます。
あなたの回答
tips
プレビュー