前提・実現したいこと
.csvファイルをJSON化するプログラムを制作しています.csvファイルの読み取りまでは上手くいったのですが,strtokとポインタの使い方がいまいち掴めず,データがboxに格納されているのか判断できません.
.csvファイルを1行ごと読み込み,strtokを使用して分解,その分解したデータを格納するタイミングで問題が起きているようです.
当該のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 512 // 1行の最大文字数(バイト数) #define X 30 int main(void) { FILE *fp; // FILE型構造体 char fname[] = "test2.csv"; char str[N]; char *box[X]; char *p; fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 if(fp == NULL) { printf("%s file not open!\n", fname); return -1; } fgets(str, N, fp); p = strtok(str, ","); puts(p); box[0] = p; while(p!=NULL){ p = strtok(NULL,","); if(p!=NULL){ int i = 1; puts(p); box[i] = p; //printf("%s\n", box[i]); i++; } } printf("%s\n", str); fclose(fp); // ファイルを閉じる for(int j=0; j<=X-1; j++){ printf("%c", *box[j]); } printf("\n");*/ return 0; }
出力されるコード
./a.out Settings Toilet_Duration Toilet_Duration 0:01 0:01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Settings Segmentation fault: 11
編集後の該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 512 // 1行の最大文字数(バイト数) #define X 512 int main(void) { FILE *fp; // FILE型構造体 char fname[] = "test2.csv"; char str[N]; char *box[X]; char *p; int i = 0; fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 if(fp == NULL) { printf("%s file not open!\n", fname); return -1; } fgets(str, N, fp); p = strtok(str, ","); puts(p); box[i] = p; i++; while(p!=NULL){ p = strtok(NULL,","); if(p!=NULL){ puts(p); box[i] = p; printf("%s\n", box[i]); i++; } } printf("%s\n", str); fclose(fp); // ファイルを閉じる printf("%c\n", *box[1]); printf("\n"); return 0; }
編集後の出力されるコード
hermes$ gcc line.c hermes$ ./a.out Settings Toilet_Duration Toilet_Duration 0:01 0:01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Settings T
元の.csvデータ
Settings,Toilet_Duration,0:01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
試したこと
どの地点でSegmentation faultが起きているのか知る為にprintf関数を使用して文字列を出力させた.
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/11 07:16
2019/07/11 07:20
2019/07/11 07:22
2019/07/11 08:07
2019/07/11 08:08
2019/07/11 08:13
2019/07/11 16:57 編集
2019/07/11 14:38 編集
2019/07/11 11:29
2019/07/12 03:05
2019/07/12 11:14