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.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[]で行っています。修正してみます!
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.4
- 回答日時:
>tatsu99さんはこちらのプログラムで実行結果が正しく表示されるのでしょうか?
私が作成したtest.csvを読み込んだ場合は、正しく表示されます。
あなたが作成したtest.csvをここに提示していただけますでしょうか。
今回、行数も関係しますので、それも正しく把握したいので
---------------------------
test.csvの内容
---------------------------
のように、test.csvの内容の前後を--------------------ではさんでください。
又、空白とは、半角の空白と理解しています。
もし、全角の空白の場合は、正しく読み込めません。その場合は、fscanfのやりかたを変える必要があります。
全角の空白の場合は、その旨、補足してください。
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.7
- 回答日時:
既に書かれてるけど, もともとの質問にあった
言葉\n
言葉,記号\n
空白の行\n
言葉\n
空白、数字、数字、数字\n
数字、数字、数字、数字EOF
という形と「csvファイルをメモ帳で開いたときのモノ」である
???,
????,####
,
?,
10,11
21,22
が全く違うって理解できる?
それはさておき, 本当はどういう形なんだ? まさかここでまた違う形を出して「本当はこうです」とか言わないだろうな?
以下本題ではないけど誤解するといけないので補足.
char buf[100];
scanf("%s", &buf);
が「正しく」動くとはいっても, それはあくまで「結果的に」であって, 論理的には間違っています. これが「正しいプログラムである」とは思わないでください.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Excel(エクセル) エクセル365の関数。誕生日表記がおかしい 2 2022/10/17 18:52
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- Chrome(クローム) 急募 Chromeの不調 1 2023/02/20 20:06
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) csvファイルをExcel形式で読み込むには 2 2023/07/03 13:09
- 日本語 充分と十分の使い分け 7 2022/09/04 09:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
Cでファイルの行数をカウントす...
-
構造体メンバの初期化
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
fread(),fwrite()等について
-
[C]セグメンテーションエラー:...
-
#defineが使用するメモリ領域に...
-
C++で指定文字列のカウント方法...
-
printf による16進表示について
-
fscanfの使い方
-
マイナスからプラスへ転じた時...
-
「指定されたキャストは有効で...
-
数字以外が入力されたらエラー...
-
C言語で簡単なパックマンゲーム...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
2÷3などの余りについて
-
4の倍数を論理演算で表す。。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
c言語で文書を読み込み、単語の...
-
reallocでエラー
おすすめ情報
回答ありがとうございます。コピペして試してみたのですが、まったく関係のない数字が表示されます。読めていないようです。tatsu99さんはこちらのプログラムで実行結果が正しく表示されるのでしょうか? 回答お待ちしています。
csvファイルをメモ帳で開いたときのモノをコピペしています。
tatsu99さんのプログラムではもう少し長いものを読んでいましたが、今は
試しに少ない数字で試しているのですがうまくいきませんでした。
下記にcsvファイルの中身を示しておきます。
よろしくお願いします。
---------------------
???,
????,####
,
?,
10,11
21,22
---------------------