2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Amazonウィジェット

  • miniPC
  • 最近買った本
  • Raspberry Pi
  • クアッドコプター
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

« python小技 map関数の小技 | トップページ | C# イベントを発生させる続編 イベントを使って値を受け渡しする »

2016年11月27日 (日)

C言語 CSVを読み込む関数をsscanfとstrchrで作ってみた。

CSVを読み取る機会は多いものの、C言語の入門本やWebにはなかなかそういうのが書いていなくて、学習の最初のほうは難儀しました。たしか最初に作ったアプリは単語帳ソフトで、CSVで保存しようとしていたのですが、どうにも動作が安定せず挫折したような記憶があります。最初から文字列処理が得意なperlないしはpythonでも使っていればもう少し簡単だったのかもしれませんが。

今までにもC言語で色々な方法でCSVを読み取る関数を作ってきましたが、今回はsscanfを使って作ってみました。


とりあえずべた書きで処理を書いてみた。

#include 

char str[] = "1,2,3,4,5,6,7,8";

void main(void){
       char *adr;
       adr = str;
       for (int i = 0; i < 10; i++){
              int res;
              int col;

              res = sscanf(adr, "%d", &col);
              if (res < 1 || res == EOF){
                     continue;
              }
              printf("%d\n", col);
              adr = strchr(adr, (int)',');
              if (adr == NULL){
                     continue;
              }
              else{
                     adr += 1;
              }
       }
}


関数にまとめてみた。

#include 

char str[] = "1,2,3,4,5,6,7,8";


//戻り値:読み取りに成功=0,取りこぼし=-1
//引数:読み取り対象文字列、読み取り値を入れる配列、読み取り要素数
int csvIntRead(const char *str, int *col, const int num){
	char *adr;

	int succNum = 0; //読み取り成功カウンタ

	//開始位置をセット
	adr = str;

	for (int i = 0; i < num; i++){
		int res;

		//数字を読み取る
		res = sscanf(adr, "%d", &col[i]);
		if (res < 1 || res == EOF){
			//読み取れなかったら終了
			break;
		}
		else{
			//読み取り成功回数をカウント
			succNum++;
		}
		
		//次のカンマを探す
		adr = strchr(adr, (int)',');
		if (adr == NULL){
			//見つからなかったら終了
			break;
		}
		else{
			//カンマがあればその次の文字を開始位置にセット。
			adr += 1;
		}
	}

	if (succNum == num){
		//指定した読み取り数と等しければ成功
		return 0;
	}
	else{
		//どこか取りこぼしがあった場合
		return -1;
	}
}


void main(void){

	int dat[8];

	int res = csvIntRead(str, dat, 2);
	for (int i = 0; i < sizeof(dat)/sizeof(int); i++){
		printf("%d\n",dat[i]);
	}
	printf("\n");

}

« python小技 map関数の小技 | トップページ | C# イベントを発生させる続編 イベントを使って値を受け渡しする »

C言語」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/64387144

この記事へのトラックバック一覧です: C言語 CSVを読み込む関数をsscanfとstrchrで作ってみた。:

« python小技 map関数の小技 | トップページ | C# イベントを発生させる続編 イベントを使って値を受け渡しする »