dポイントプレゼントキャンペーン実施中!

C言語でCSVファイルの読み込みをしようとしています。CSVの中身は以下の2通りあります。
・[ ] で囲った文字列(1行に1つだけ)
・データの並び(1行に2つ以上)
具体的には、[ ] で囲った文字列と、最初の2つのデータのみが抽出対象です。そこで以下のコードを書いてみましたが、最後に示すように、[ ] で囲った文字列がうまく抽出できません。以下のコードのようなsscanfの使い方は間違っているのでしょうか?正しく動作するにはどうすればよいか、教えて下さい。

---------- 以下、ソースコード
#include <stdio.h>
#include <string.h>

int main(void)
{
 FILE *fp;
 char *fname = "test.csv";
 char s1[32], s2[16];
 int ret;

 char str[128];    /* csvファイルの一行 */
 char structName[32];  /* セパレータ名 */

 fp = fopen( fname, "r" );
 if( fp == NULL ){
  printf( "%sファイルが開けません\n", fname );
  return -1;
 }

 while( fgets( str, 128, fp ) != NULL ){
  
  /* セパレータ */
  if( str[0] == '[' ){
   printf( "str = %s\n", str );
   ret = sscanf( str, "[%s]\n", structName );
   printf( "structName = %s\n", structName );
   continue;
  }
  
  ret = sscanf( str, "%[^,],%[^,]", s1, s2 );
  
  printf( "s1 = %s\n", s1 );
  printf( "s2 = %s\n", s2 );
 }

 fclose( fp );
 return ret;
}

---------- 以下、"test.csv"の中身
[ABC]
test01,10,11,1.0,1.1
test02,20,21,2.0,2.1
test03,30,31,3.0,3.1
[DEF]
test04,40,41,4.0,4.1

---------- 以下、実行結果
str = [ABC]

structName = ABC]
s1 = test01
s2 = 10
s1 = test02
s2 = 20
s1 = test03
s2 = 30
str = [DEF]

structName = DEF]
s1 = test04
s2 = 40

A 回答 (3件)

[]のなかに入る文字種は限定できるのでしょうか?


英数字に限定なら
sscanf( str, "[%[A-Z,a-z,0-9]]\n", structName );
といった具合にしてやればいいでしょう

%sの場合 TABや空白、改行までを取得しようとするので
ABC]まで読み込んでしまうのだと思います
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
教えていただいた方法で、できました!

お礼日時:2010/12/20 20:30

「うまく」と言って誰もがわかるのか? ってこと.


ちなみに %[^]] の方がいいかもね.
    • good
    • 0
この回答へのお礼

「うまく」の定義を書くべきでした。初歩的なミスでお手間をとらせて申し訳ありません。

お礼日時:2010/12/23 12:05

「[ ] で囲った文字列がうまく抽出できません。

」とはどういうことでしょうか? 何をもって「うまく抽出できていない」と判断しているのかわかりません.
    • good
    • 0
この回答へのお礼

質問に記載した入力データに対する実行結果が「[」と「]」で囲った文字列にならなかったので、正しく抽出できていないと判断しました。ご指摘の意味がわかりませんので、ご指摘の補足をお願いします。

お礼日時:2010/12/20 20:35

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