揮発性のメモ2

http://d.hatena.ne.jp/iww/

scanfでcsvを分解する

「数字,数字,文字列,文字列」みたいなカンマ区切りの文字列をscanfで分解する。

空白とかのトリミング

scanfは文字列を読み込みときにバッファの最大長を指定できるので、これを使えばバッファオーバーランは発生しない。
また、フォーマット文中の空白は「0バイト以上のホワイトスペース」として扱われる。
scanf( " %4s ",str )と書けば、「ホワイトスペースを含まない4バイト以内の文字列」がstrに入る。
\0の分 1バイト余分に確保しておく。

カンマ区切りとか

%sは「ホワイトスペース以外の文字列」を意味するので、文字列とカンマをくっつけて書くとカンマも一緒に取り込まれてしまう。
そこで、%sの代わりに%[^\t\r\n ,]とすると「ホワイトスペースおよびカンマを含まない文字列」と扱われる。
scanf( " %4[^\t\r\n ,] , %4[^\t\r\n ,] ",str1,str2 )という感じ。



途中に空白を含むカラムや"a,b"のようにカンマを含むカラム、1,,3,4 みたいに何もないカラムがあると読めない。
このやり方は簡易的なものだからあきらめる。

    i=0;
    while( fgets( buf, sizeof(buf), fp ) ){
        // コメント行とばし
        if( buf[0]=='#' ) continue;

        // 設定ファイル1行読み出し
        s = &hoge[i];
        result = sscanf( buf, " %d , %d , %40[^\t\r\n ,] , %40[^\t\r\n ,] ", 
                         &s->A, &s->B, s->C, s->D );
        if( result<COLMAX ){
            log_printf("要素が足りない\n");
            continue;
        }

        i++;
        if( i>=HOGEMAX ) break;
    }