|
はじめまして。
いまCSVファイルのデータを分割して取得するプログラムを作成しています。(環境:windowsXP/VC++ 6.0)
CSVファイルのデータ
11,22,33,44,55,66,77,88,99,00,12,34,56,78,90[CRLF]
を取得して","ごとに分割したいのですが、データ長およびデータ数が不定なため、メモリを動的に確保して処理するように考えました。
処理としては、
1データを、動的にメモリを確保したdataに格納する。
2データの","をNULLに置き換える
3同時に各要素の先頭アドレスを管理変数dtadminに格納していく
(データ数が不定なため、管理変数dtadminもメモリを動的に確保する)
4データを処理する際は管理変数dtadminを利用してデータにアクセスする
を考えました。
プログラムを作成して実行すると、以下の問題が発生し、解決できません。
・分割したデータにゴミ(不定値)が入る(→デバッガにより確認)
11 22 33 44 55 66 77 ゴミ 88 99 00 12 34 56 78 ゴミ 90
・分割したデータを数値に変換しようとするとプログラムが強制終了する
アドバイスお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
int main()
{
int i, idata;
char seps[] = ",";
char* rtnchr;
FILE *fp;
char* data;
int dtsize;
char** dtadmin;
int dtadmnum;
fp = fopen("data.csv", "r");
// メモリ領域を動的に確保
dtsize = 100;
data = malloc(dtsize);
dtadmnum = 20;
dtadmin = malloc(dtadmnum);
// データを取得、データを分割する
rtnchr = fgets(data, dtsize, fp);
fclose(fp);
*dtadmin = data; // 先頭アドレスをセット
dtadmin++;
*dtadmin = strtok(data, seps); // トークン切出し
while(NULL != *dtadmin) {
dtadmin++;
*dtadmin = strtok(NULL, seps);
}
// データを数値に変換
*dtadmin = data;
for (i = 0 ; *dtadmin != NULL; i++, dtadmin++) {
idata = atoi(*dtadmin);
}
free(data);
free(dtadmin);
return(0);
}
|