- ベストアンサー
ファイル読み込みについて
CまたはC++で、データごとにタブで区切られたテキストファイルを読み込む処理があります。 例) 項目1(タブ)fea 5310 a(タブ)2009(改行) 項目2(タブ)dc 6307(タブ)2012(改行) 項目3(タブ)beaf 23 t(タブ)2010(改行) fscanf で読み込もうとしたのですが、タブとスペースが同じように扱われてしまうようで、 スペースが含まれるデータがある場合、上手く読み込めませんでした。 結局、fgets で一行ずつ一時バッファに読み込んでから一文字ずつチェックして データごとに切り分けたのですが、釈然としません。 もっと簡潔な方法はないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
strtok関数を使用して文字列を分割 http://www.c-tipsref.com/tips/string/strtok.html C言語Tips集 - 文字列を指定文字で分割する
その他の回答 (1)
- wormhole
- ベストアンサー率28% (1626/5665)
回答No.1
>結局、fgets で一行ずつ一時バッファに読み込んでから一文字ずつチェックして データごとに切り分けたのですが、釈然としません。 strchrを使うというのはどうですか
質問者
お礼
wormhole 様 ご回答ありがとうございます。 現在の処理が、文字のチェックとコピーを同一のループ内で行っておりますので、 strchr でチェック ⇒ (NULLポインタチェック) ⇒ 一つ前の文字までコピー、となると、処理コストが増えてしまいそうな点が残念です。 しかし、ライブラリ関数を使うことで開発効率や見通しの良さでのメリットはありますし、 いずれ使う機会がある便利な関数だと思います。教えて頂きありがとうございました。
お礼
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++; }