【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20503

csvファイルを読み込み数値変換
投稿者---HIT(2005/03/28 18:53:24)


開発環境はXPでbcpadでコンパイルしています。

csvファイルを読み込み、数値を構造体に入れて構造体同士を割り算して追加で表示さしたいのですが
数値変換されていないためエラーがでると思われます。

良いアドバイスがあればご教授願います。


#include<stdio.h>
#include<stdlib.h>


typedef struct addrData{
char yasai[20];
int a[20];
int b[20];
int c[20];
int d[20];
}addrDara;

int main(void)
{
struct addrData addr;
FILE *fp;

if((fp = fopen("test.csv","r")) == NULL)
{
printf("ファイルを開くことができません。\n");
exit(EXIT_FAILURE);
}

while(fscanf(fp,"%s %s %s %s ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=EOF){

addr.d=addr.c/addr.a;
printf("%5s %5s %5s %5s %5s \n",addr.yasai, addr.a, addr.b ,addr.c, addr.d);
}

fclose(fp);
return 0;

}

*********************************************
test.csvの中身

枝豆,40,12,4
椎茸,40,0,1.6
ほうれん草,80,52,2.8
茄子,100,5,1.8
さつまいも,50,15,0.9
トマト,150,30,1.1
南瓜,80,31,2.2
*********************************************


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:csvファイルを読み込み数値変換 20504 とおり 2005/03/28 19:26:34
<子記事> Re:csvファイルを読み込み数値変換 20507 Craft 2005/03/28 19:48:09
<子記事> Re:csvファイルを読み込み数値変換 20511 RiSK 2005/03/28 22:40:49
<子記事> Re:csvファイルを読み込み数値変換 20513 かずま 2005/03/29 03:45:44


No.20504

Re:csvファイルを読み込み数値変換
投稿者---とおり(2005/03/28 19:26:34)


こんばんわ

fscanf(fp,"%s,%d,%d,%d ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=

↑これでどうですか?

>開発環境はXPでbcpadでコンパイルしています。
>
>csvファイルを読み込み、数値を構造体に入れて構造体同士を割り算して追加で表示さしたいのですが
>数値変換されていないためエラーがでると思われます。
>
>良いアドバイスがあればご教授願います。
>
>
>#include<stdio.h>
>#include<stdlib.h>
>
>
>typedef struct addrData{
> char yasai[20];
> int a[20];
> int b[20];
> int c[20];
> int d[20];
>}addrDara;
>
>int main(void)
>{
> struct addrData addr;
> FILE *fp;
>
> if((fp = fopen("test.csv","r")) == NULL)
> {
> printf("ファイルを開くことができません。\n");
> exit(EXIT_FAILURE);
> }
>
> while(fscanf(fp,"%s %s %s %s ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=EOF){
>
> addr.d=addr.c/addr.a;
> printf("%5s %5s %5s %5s %5s \n",addr.yasai, addr.a, addr.b ,addr.c, addr.d);
> }
>
> fclose(fp);
> return 0;
>
>}
>
>*********************************************
>test.csvの中身
>
>枝豆,40,12,4
>椎茸,40,0,1.6
>ほうれん草,80,52,2.8
>茄子,100,5,1.8
>さつまいも,50,15,0.9
>トマト,150,30,1.1
>南瓜,80,31,2.2
>*********************************************



この投稿にコメントする

削除パスワード

No.20505

Re:csvファイルを読み込み数値変換
投稿者---とおり(2005/03/28 19:33:49)


>こんばんわ
>
>fscanf(fp,"%s,%d,%d,%d ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=
>
>↑これでどうですか?

ごめんなさい。うそつきました。
これじゃ全然だめだわ。
時間がないので他の人にパスします。
ゴメンね無責任で。。。


この投稿にコメントする

削除パスワード

No.20506

Re:csvファイルを読み込み数値変換
投稿者---HIT(2005/03/28 19:43:46)


>こんばんわ
>
>fscanf(fp,"%s,%d,%d,%d ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=
>
>↑これでどうですか?


残念ながら無理でした。
おそらくatoiとstrtokの関数を使ってできるのではないかと考えていますがうまく動作しなくて。。

アドバイスよろしくお願いします。


この投稿にコメントする

削除パスワード

No.20507

Re:csvファイルを読み込み数値変換
投稿者---Craft(2005/03/28 19:48:09)


こんばんは。

構造体のメンバがintで宣言されているのに、
>typedef struct addrData{
> char yasai[20];
> int a[20];
> int b[20];
> int c[20];
> int d[20];
>}addrDara;

%s でfscanfしたらアクセス違反になるような気がします。
> while(fscanf(fp,"%s %s %s %s ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=EOF){

yasai 以外を%dでfscanfするようにすればうまくいくと思いますよ。


この投稿にコメントする

削除パスワード

No.20508

Re:csvファイルを読み込み数値変換
投稿者---HIT(2005/03/28 20:01:56)


>構造体のメンバがintで宣言されているのに、
>>typedef struct addrData{
>> char yasai[20];
>> int a[20];
>> int b[20];
>> int c[20];
>> int d[20];
>>}addrDara;
>
>%s でfscanfしたらアクセス違反になるような気がします。
>> while(fscanf(fp,"%s %s %s %s ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=EOF){
>
>yasai 以外を%dでfscanfするようにすればうまくいくと思いますよ。

アドバイスありがとうございます。

while(fscanf(fp,"%s %d %d %d ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=EOF){
addr.d=addr.c/addr.a;

上のように試しましたが、addr.d=addr.c/addr.a;のところで「ポインタの不正な使用」とエラーがでて実行できませんでした。

他に良いアドバイスがあればよろしくお願いいたします。


この投稿にコメントする

削除パスワード

No.20509

Re:csvファイルを読み込み数値変換
投稿者---Craft(2005/03/28 20:14:59)


>アドバイスありがとうございます。
>
> while(fscanf(fp,"%s %d %d %d ",&addr.yasai, &addr.a, &addr.b,&addr.c )!=EOF){
> addr.d=addr.c/addr.a;
>
>上のように試しましたが、addr.d=addr.c/addr.a;のところで「ポインタの不正な使用」とエラーがでて実行できませんでした。

言葉足らずでした。
addr.a〜addr.dは配列なので、fscanfするときに要素番号なしで指定すると正しく格納されません。
一次的に別な変数に fscanf するか、カウンタを持たせて要素0〜順次セットされるようにしないとダメです。
当然、要素いくつまで読み込んだのかもわかるようにする必要があります。

計算式についても同様で、
addr.d=addr.c/addr.a は、 addr.d[1] = addr.c[1]/addr.a[1]; のように
要素番号を与えてあげないといけません。

正常に動くソースを書いている余裕がないので、このくらいしかかけませんが、がんばってください。


この投稿にコメントする

削除パスワード

No.20510

Re:csvファイルを読み込み数値変換
投稿者---HIT(2005/03/28 20:42:26)


>言葉足らずでした。
>addr.a〜addr.dは配列なので、fscanfするときに要素番号なしで指定すると正しく格納されません。
>一次的に別な変数に fscanf するか、カウンタを持たせて要素0〜順次セットされるようにしないとダメです。
>当然、要素いくつまで読み込んだのかもわかるようにする必要があります。
>
>計算式についても同様で、
>addr.d=addr.c/addr.a は、 addr.d[1] = addr.c[1]/addr.a[1]; のように
>要素番号を与えてあげないといけません。
>
>正常に動くソースを書いている余裕がないので、このくらいしかかけませんが、がんばってください。

詳しいアドバイスありがとうございます。
大変参考になりました。
構造体を勉強しながら挑戦したいと思います。


この投稿にコメントする

削除パスワード

No.20511

Re:csvファイルを読み込み数値変換
投稿者---RiSK(2005/03/28 22:40:49)


# 今日は疲れているのでハイテンション!

>csvファイルを読み込み、数値を構造体に入れて構造体同士を割り算して追加で表示さしたいのですが
>数値変換されていないためエラーがでると思われます。

構造体同士は割り算できません。構造体のメンバ同士は割り算できる可能性もあります。
#「さしたい」じゃなくて「させたい」ねっ

>良いアドバイスがあればご教授願います。

いろいろ質問します。'?'に反応して答えてくださいませ。
仕様の話をします。

>typedef struct addrData{
>   char yasai[20];
>   int a[20];
>   int b[20];
>   int c[20];
>   int d[20];

yasai はいいですが,a,..d がそれぞれ配列になっているのはなぜですか?
    int a;
    int b;
    int c;
    int d;
ではダメですか?
あるいはそれらをまとめて
    int a[4];
とするのはダメですか?


>test.csvの中身

>枝豆,40,12,4
これは 文字列, 整数, 整数, 整数 でいいかもしれませんが


>椎茸,40,0,1.6

これは 文字列, 整数, 整数, 実数 だと思います。
4つ目の要素は実数なのでしょうか?
',' を間違って '.' にしたのですか?
(だとすると要素数が可変になってしまうなぁ…)
それとも "1.6" という文字列でしょうか?


CSV の仕様がハッキリ決まれば fscanf の書式もそれにあわせることができます。

文字列, 整数, 整数, 整数, 実数(改行)

でいいですか?



この投稿にコメントする

削除パスワード

No.20512

Re:csvファイルを読み込み数値変換
投稿者---RiSK(2005/03/28 22:44:15)


>文字列, 整数, 整数, 整数, 実数(改行)
>
>でいいですか?

"整数,"一個多かった…。脳内で消してください。


この投稿にコメントする

削除パスワード

No.20513

Re:csvファイルを読み込み数値変換
投稿者---かずま(2005/03/29 03:45:44)


【掲示板ご利用上の注意】
 ※ソースの添付は「HTML変換ツール」で字下げ!
#include <stdio.h>
#include <stdlib.h>

typedef struct { char yasai[20]; int a, b; double c, d; } addrData;

int main(void)
{
    addrData addr;  char buf[1024];

    FILE *fp = fopen("test.csv", "r");
    if (fp == NULL) puts("ファイルを開くことができません。"), exit(1);

    while (fgets(buf, sizeof buf, fp))
        if (sscanf(buf, " %18[^,],%d ,%d ,%lf",
                &addr.yasai, &addr.a, &addr.b, &addr.c) == 4) {
            addr.d = addr.c / addr.a;
            printf("%-10s %5d %5d %5.1f %8.4f\n",
                addr.yasai, addr.a, addr.b ,addr.c, addr.d);
        } else
            printf("bad data: %s", buf);

    fclose(fp);
    return 0;
} 



この投稿にコメントする

削除パスワード

No.20516

Re:csvファイルを読み込み数値変換
投稿者---HIT(2005/03/30 11:53:17)


>【掲示板ご利用上の注意】
> ※ソースの添付は「HTML変換ツール」で字下げ!
><pre>
#include <stdio.h>
#include <stdlib.h>

typedef struct { char yasai[20]; int a, b; double c, d; } addrData;

int main(void)
{
addrData addr; char buf[1024];

FILE *fp = fopen("test.csv", "r");
if (fp == NULL) puts("ファイルを開くことができません。"), exit(1);

while (fgets(buf, sizeof buf, fp))
if (sscanf(buf, " %18[^,],%d ,%d ,%lf",
&addr.yasai, &addr.a, &addr.b, &addr.c) == 4) {
addr.d = addr.c / addr.a;
printf("%-10s %5d %5d %5.1f %8.4f\n",
addr.yasai, addr.a, addr.b ,addr.c, addr.d);
} else
printf("bad data: %s", buf);

fclose(fp);
return 0;
}
</pre>

わざわざ、プログラムを記述してもらってありがとうございます。
私が求めていた処理結果がこれです。プログラムを参考にして勉強し直したいと思います。ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧