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
No.3
- 回答日時:
「うまく」と言って誰もがわかるのか? ってこと.
ちなみに %[^]] の方がいいかもね.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
空白を含んだ文字列がうまく格...
-
#defineが使用するメモリ領域に...
-
C言語のプログラムで、途中で止...
-
Ç言語でファイルサイズを変更す...
-
csvファイルの読み取り
-
プログラミングの授業の課題です
-
Linuxで入力待ちなしkeyread関...
-
「指定されたキャストは有効で...
-
intとlongは同じ?
-
マイナスからプラスへ転じた時...
-
プログラムでの数字につく”f”の...
-
c言語のmまたはnが13以上となる...
-
str系関数を使わずに二つの文字...
-
DWORDの実際の型は何でしょうか
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
10個出力で改行したいのですが...
-
2進数の1の数を数える問題
-
break文でループを一気に抜ける...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
C言語のプログラムで、途中で止...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
プログラミングの授業の課題です
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
Cでファイルの行数をカウントす...
-
char型2つを結合し、short型に...
-
矢印キーを押下してコンソール...
-
C言語で複数列のデータを1列の...
-
終了条件Ctrl+zについて,結果表...
-
Ç言語でファイルサイズを変更す...
-
エラーについて質問です。
-
C言語でのCSVファイルの読み出...
-
C++で指定文字列のカウント方法...
-
VC++でSQLへSELECT文を送ったの...
-
fscanfの使い方
-
ファイル操作で全角空白を消す
おすすめ情報