• ベストアンサー

ファイル読み込みについて

CまたはC++で、データごとにタブで区切られたテキストファイルを読み込む処理があります。 例) 項目1(タブ)fea 5310 a(タブ)2009(改行) 項目2(タブ)dc 6307(タブ)2012(改行) 項目3(タブ)beaf 23 t(タブ)2010(改行) fscanf で読み込もうとしたのですが、タブとスペースが同じように扱われてしまうようで、 スペースが含まれるデータがある場合、上手く読み込めませんでした。 結局、fgets で一行ずつ一時バッファに読み込んでから一文字ずつチェックして データごとに切り分けたのですが、釈然としません。 もっと簡潔な方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

strtok関数を使用して文字列を分割 http://www.c-tipsref.com/tips/string/strtok.html C言語Tips集 - 文字列を指定文字で分割する

hirofss
質問者

お礼

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++; }

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

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

hirofss
質問者

お礼

wormhole 様 ご回答ありがとうございます。 現在の処理が、文字のチェックとコピーを同一のループ内で行っておりますので、 strchr でチェック ⇒ (NULLポインタチェック) ⇒ 一つ前の文字までコピー、となると、処理コストが増えてしまいそうな点が残念です。 しかし、ライブラリ関数を使うことで開発効率や見通しの良さでのメリットはありますし、 いずれ使う機会がある便利な関数だと思います。教えて頂きありがとうございました。