CSV_Iクラス:
CSVファイルを読み込むクラス。
store_strで一行ずつデータを読み込む。
変数の型変換などは、呼び出し元のプログラムに任せる。
素朴な処理(一文字ずつ処理してる)なので、処理が重いかも。
文字列ストリーム処理をすべき?
/*************************
CSV_I.h
*************************/
#include <stdio.h>
#include <string.h>
#ifndef _CSV_I_H_
#define _CSV_I_H_
class CSV_I{
typedef char buftype[64] ;
FILE* ifp; //出力するCSVのファイルポインタ
int row, col;
static const int FGETS_SIZE = 512;
public:
CSV_I(){ifp = NULL;}
bool open_csv(const char* filename); //引数で与えたファイル名のCSVをオープンする
bool store_str(char L, char R, buftype buf_ary[]); //L列からR列までの要素をbuf_ary[]に格納する
~CSV_I();
private:
};
#endif //_CSV_I_H_
/*************************
CSV_I.cpp
*************************/
#include "CSV_I.h"
//引数で与えたファイル名のCSVをオープンする
bool CSV_I::open_csv(const char* filename){
if(ifp){
fclose(ifp);
}
if(!(ifp = fopen(filename, "r+"))){
return false;
}
return true;
}
//L列からR列までの要素をbuf_ary[]に格納する
bool CSV_I::store_str(char L, char R, buftype buf_ary[]){
char line_buf[FGETS_SIZE];
int s = L - 'A'; //引数の列名を整数型に変換
int t = R - 'A';
if(L > R){ //引数エラー
return false;
}
if(!fgets(line_buf, FGETS_SIZE, ifp)){
return false;
}
memset(buf_ary, '\0', sizeof(buftype)*(R-L+1));
//fprintf(stderr, "%s", line_buf);
for(int i=0, j=0; i<t; i++){ //i:コンマごとのカウンタ。j:文字ごとのカウンタ
for(int k=0; line_buf[j] != ','; k++){
if(i<s){ //L列より左の要素は切り捨てる
j++;
}
else{
buf_ary[i-s][k] = line_buf[j];
//fprintf(stderr, "%c", line_buf[j]);
j++;
}
}
j++; //コンマ分インクリメント
}
}
CSV_I::~CSV_I(){
if(ifp){
fclose(ifp);
}
}
/***** 利用例 *****
#include "csv_i.h"
#define CSV_FILE "C:\\tex\\temp.csv"
#define LCOL 'A'
#define RCOL 'G'
int main (){
CSV_I ci;
typedef char buftype[64];
buftype buf_ary[RCOL-LCOL+1];
ci.open_csv(CSV_FILE);
for(int i=0; ci.store_str(LCOL, RCOL, buf_ary); i++){
for(int j=0; j<RCOL-LCOL+1; j++){
fprintf(stderr, "%s, ", buf_ary[j]);
}
putchar('\n');
}
return 0;
}
*************/
累計のアクセス数: -
今日のアクセス数: -
昨日のアクセス数 -
最終更新:2011年07月25日 08:18