アプリ版:「スタンプのみでお礼する」機能のリリースについて

CまたはC++で、データごとにタブで区切られたテキストファイルを読み込む処理があります。

例)
項目1(タブ)fea 5310 a(タブ)2009(改行)
項目2(タブ)dc 6307(タブ)2012(改行)
項目3(タブ)beaf 23 t(タブ)2010(改行)

fscanf で読み込もうとしたのですが、タブとスペースが同じように扱われてしまうようで、
スペースが含まれるデータがある場合、上手く読み込めませんでした。

結局、fgets で一行ずつ一時バッファに読み込んでから一文字ずつチェックして
データごとに切り分けたのですが、釈然としません。

もっと簡潔な方法はないでしょうか?

A 回答 (2件)

strtok関数を使用して文字列を分割



http://www.c-tipsref.com/tips/string/strtok.html
C言語Tips集 - 文字列を指定文字で分割する
    • good
    • 0
この回答へのお礼

don_go 様

ご回答ありがとうございます。

こちらも処理コストは増えてしまいそうなのですが、
非常に簡潔に既述できたのでベストアンサーとさせて頂きます。
ありがとうございました!

struct RECORD Records[1024];
char line[256];
int cnt = 0;

while(fgets(line, sizeof(line), fp)) {
strcpy(Records[cnt].sNumber, strtok(line, "\t"));
strcpy(Records[cnt].sItemCode, strtok(NULL, "\t"));
strcpy(Records[cnt].sRegDate, strtok(NULL, "\t"));
cnt++;
}

お礼日時:2013/04/21 19:37

>結局、fgets で一行ずつ一時バッファに読み込んでから一文字ずつチェックして


データごとに切り分けたのですが、釈然としません。

strchrを使うというのはどうですか
    • good
    • 0
この回答へのお礼

wormhole 様

ご回答ありがとうございます。

現在の処理が、文字のチェックとコピーを同一のループ内で行っておりますので、
strchr でチェック ⇒ (NULLポインタチェック) ⇒ 一つ前の文字までコピー、となると、処理コストが増えてしまいそうな点が残念です。

しかし、ライブラリ関数を使うことで開発効率や見通しの良さでのメリットはありますし、
いずれ使う機会がある便利な関数だと思います。教えて頂きありがとうございました。

お礼日時:2013/04/21 19:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!