上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--|スポンサー広告||TOP↑
怒涛の更新!
さて、最近C言語を使っているのだが、C言語にはCSVを読むのに適した関数がない。
特に文字列分割するのに適したものがない。(これは関数間の配列の受け渡しが面倒なせいだろう。)
strtokを思いつくかもしれないが、この用途に適していない。なぜなら、CSVの空要素を無視してしまうからだ。英文からの単語の抜き出しとかには最適なのだが(というか、これが本来の目的なんだろう)

というわけで、作ってみた。
ソースはちょっと長いので、追記のほうに。

使い方はソースのコメント部分を読んでもらうとして、これの特徴は以下のとおり。
・改行と終端を終わりとして扱うので、fgets()などと組み合わせやすい。
・CSVの文法上のエラーを検知しない。(よって戻り値なし)
・ダブルクォーテーション未対応。(つまり、文字列としてカンマと改行は使用できない)
・とりあえずShift-JISには対応するが、これはカンマの文字コードが2バイト目に使用されていないだけである。

しかし、この関数。なんか昔どこかで見たような。<<まぁ、いいや。さぁ、いくか!>>

以下ソース


#include <stddef.h>
/*
[名称]
カンマ区切り関数

[説明]
カンマ区切りの文字列から指定された数の要素を先頭から読み出す。
読み出された文字列はBufにおかれ、各要素の先頭へのポインタを、
Memberで指定された配列へ格納する。
この関数は要求に対し、ソースの要素が足りない場合は空文字列を、余った場合には無視し、
必ずMemberにNum個の要素を格納する。

[引数]
Member: 各要素の文字列への先頭ポインタを格納する配列。
Buf: 処理結果の文字列を格納するバッファ。Srcが示す文字列と等しいサイズが必要。
Src: 処理対象の文字列。
Num: 取得する要素数。
[戻り値]
なし
*/
void splitComma(char *_Member[], char *_Buf, const char *_Src, size_t _Num)
{
  char *memStart = _Buf;
  char *bufp = _Buf;
  const char *srcp = _Src;
  unsigned int i;

  for (i=0; i<_Num;)
  {
    switch (*srcp)
    {
    case 0:
    case '\n':
      *bufp = 0;
      _Member[i++] = memStart;
      memStart = bufp;
      break;

    case ',':
      *bufp++ = 0;
      srcp++;
      _Member[i++] = memStart;
      memStart = bufp;
      break;

    default:
      *bufp++ = *srcp++;
    }
  }
}
スポンサーサイト
06/14|プログラムコメント(0)トラックバック(0)TOP↑
この記事にコメント
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
この記事にトラックバック
プロフィール

G.U.Nex

Author:G.U.Nex
職業:プログラマ
趣味:ゲーム(PC、コンシューマ)、ネットサーフィン、ニコニコ動画視聴、プログラミング、鉄道全般
PHP, C, C++, VB(系), Java, JavaScriptを使える。
最近はRubyにはまってる。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク
フリーエリア
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。