

C言語を勉強中です。
下記のcsvファイルを読み込みたいのですが、
---------------------------------
言葉\n
言葉,記号\n
空白の行\n
言葉\n
空白、数字、数字、数字\n
数字、数字、数字、数字EOF
---------------------------------
表示が
---------------------------------
言葉
意味不明な文字……
---------------------------------
となります。正しく読めるのは1つめのみです。
読み取りたいのは数字だけなので上から5行目から読み込む方法、と空欄を読み飛ばす方法を教えてください。もしくは正しく読み込む方法を教えてください。
現在は
fp=fopen("test.csv","r");
fscanf(fp,"%[^,],%[^,],%[^,],%[^,],%lf,%lf,%lf,%lf,%lf,%lf,%lf",&a,&b,&c,&d,&n1,&n2,&n3,&n4,&n5,&n6,&n7);
printf("%s,%s,%s,%s,%f,%f,%f,%f,%f,%f,%f\n",a,b,c,d,n1,n2,n3,n4,n5,n6,n7);
と書いています。
空欄の読み方、改行を読むときがおかしいということは何となく分かるのですがどう修正すればよいのかわかりません。
また、%[^,]を使用せず、%sを使用して1行丸々読み込んでもいいのですが、その場合も1行目のみ正しく読み込まれ、2行目以降は意味不明な記号の羅列が表示されてしまいます。
よろしくお願いします。
No.7
- 回答日時:
既に書かれてるけど, もともとの質問にあった
言葉\n
言葉,記号\n
空白の行\n
言葉\n
空白、数字、数字、数字\n
数字、数字、数字、数字EOF
という形と「csvファイルをメモ帳で開いたときのモノ」である
???,
????,####
,
?,
10,11
21,22
が全く違うって理解できる?
それはさておき, 本当はどういう形なんだ? まさかここでまた違う形を出して「本当はこうです」とか言わないだろうな?
以下本題ではないけど誤解するといけないので補足.
char buf[100];
scanf("%s", &buf);
が「正しく」動くとはいっても, それはあくまで「結果的に」であって, 論理的には間違っています. これが「正しいプログラムである」とは思わないでください.

No.5
- 回答日時:
提示された行の
5行目は、空白、数字、数字、数字\n
6行目は、数字、数字、数字、数字EOF
のはずです。
あなたが提示されたデータは
10,11
21,22
となっています。
これを
空白,10,11,12 ・・・半角空白と12を追加(カンマは半角カンマ)(5行目)
21,22,23,24 ・・・23と24を追加(カンマは半角カンマ)(6行目)
としてください。
そうすれば、
<11.000000><12.000000><13.000000>
<21.000000><22.000000><23.000000><24.000000>
と表示されるはずです。

No.4
- 回答日時:
>tatsu99さんはこちらのプログラムで実行結果が正しく表示されるのでしょうか?
私が作成したtest.csvを読み込んだ場合は、正しく表示されます。
あなたが作成したtest.csvをここに提示していただけますでしょうか。
今回、行数も関係しますので、それも正しく把握したいので
---------------------------
test.csvの内容
---------------------------
のように、test.csvの内容の前後を--------------------ではさんでください。
又、空白とは、半角の空白と理解しています。
もし、全角の空白の場合は、正しく読み込めません。その場合は、fscanfのやりかたを変える必要があります。
全角の空白の場合は、その旨、補足してください。

No.3
- 回答日時:
以下のようにしてください。
-------------------------------------------
#include <stdio.h>
int main(void){
FILE *fp;
double d11,d12,d13;
double d21,d22,d23,d24;
if((fp = fopen("test.csv","r"))==NULL){
printf("not open\n");
}
fscanf(fp,"%*s"); //1行空読み
fscanf(fp,"%*s"); //1行空読み
fscanf(fp,"%*s"); //2行空読み(空白行も含めて空読みする為、2行空読みする)
fscanf(fp," ,%lf,%lf,%lf",&d11,&d12,&d13);
fscanf(fp,"%lf,%lf,%lf,%lf",&d21,&d22,&d23,&d24);
fclose(fp);
//確認用
printf("<%f><%f><%f>\n",d11,d12,d13);
printf("<%f><%f><%f><%f>\n",d21,d22,d23,d24);
return 0;
}
-------------------------------------------
test.csvの内容が、以下の場合
-------------------------------------
言葉1
言葉2,#
言葉3
,11,12,13
21,22,23,24
--------------------------------------
実行結果
<11.000000><12.000000><13.000000>
<21.000000><22.000000><23.000000><24.000000>
となります。
No.1
- 回答日時:
a,b,c,d,n1,n2,n3,n4,n5,n6,n7
の宣言がわからなければ、なんとも言えません。
ただ。
fscanf(fp,"%[^,],%[^,],%[^,],%[^,],%lf,%lf,%lf,%lf,%lf,%lf,%lf",&a,&b,&c,&d,&n1,&n2,&n3,&n4,&n5,&n6,&n7);
で、 %s に対応する変数の型は char *, char[]等です。
&a,&b,&c,&d としていますが、これは変数 a,b,c,dへのポインタとなります。
&a が char * なら、 aは char です。
対して
printf("%s,%s,%s,%s,%f,%f,%f,%f,%f,%f,%f\n",a,b,c,d,n1,n2,n3,n4,n5,n6,n7);
としたときの %s に対応したa,b,c,d の求められるのは 、char * や char[]等の「文字列(として使われるポインタや配列)」です。
あきらかに、型が矛盾しています
ご指摘ありがとうございます。まだまだ勉強不足で型が矛盾していることに気が付きませんでした。宣言はchar[]で行っています。修正してみます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
ファイル操作で全角空白を消す
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
エラーについて質問です。
-
main.c:7:43: warning: implici...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
有効数字について 以前質問をし...
-
プログラムでの数字につく”f”の...
-
「指定されたキャストは有効で...
-
20'(角度)の計算がわかりま...
-
複数桁10進数の*桁目だけを抽出...
-
信頼区間の1.96や1.65ってどこ...
-
C言語での引数の省略方法
-
do-while文が禁止される理由
-
エクセルで可視セルにのみ値貼...
-
値差の%計算方法について
-
2÷3などの余りについて
-
#if 1 #elseの意味について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
エラーについて質問です。
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
プログラミングの授業の課題です
-
csvファイルの読み取り
-
Cプログラムについて
-
strtok
-
矢印キーを押下してコンソール...
-
C言語で複数列のデータを1列の...
-
ポインタと配列
-
構造体メンバの初期化
-
言語Cについて教えていただけま...
-
C++で指定文字列のカウント方法...
-
小数の指数表示
-
VC++でSQLへSELECT文を送ったの...
-
reallocでエラー
-
ファイル
おすすめ情報
回答ありがとうございます。コピペして試してみたのですが、まったく関係のない数字が表示されます。読めていないようです。tatsu99さんはこちらのプログラムで実行結果が正しく表示されるのでしょうか? 回答お待ちしています。
csvファイルをメモ帳で開いたときのモノをコピペしています。
tatsu99さんのプログラムではもう少し長いものを読んでいましたが、今は
試しに少ない数字で試しているのですがうまくいきませんでした。
下記にcsvファイルの中身を示しておきます。
よろしくお願いします。
---------------------
???,
????,####
,
?,
10,11
21,22
---------------------