掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

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

No.30098

CSVファイルを読み込んでstrtokで分解した後、出力するには?
投稿者---亀吉(2007/05/10 20:39:43)


C言語で、CSVファイルを読み込み、strtokで分解し構造体に格納し、画面に出力したいと思ってプログラムを作ってみました。

ちなみに読み込むファイルは
seiseki.txt

1,100,優
2,50,不可
3,60,可

です。
作ってみたプログラムが

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

struct suji
{
int no;
int ten;
char *hantei;
};

int main(void)
{
FILE *fp;
int i=0;
struct suji score[3];
char str[256];

if((fp= fopen("seiseki.txt", "r")) == NULL)exit(1);


while(fgets(str,256,fp) != NULL)
{
score[i].no = atoi(strtok(str,","));
score[i].ten = atoi(strtok(NULL,","));
score[i].hantei = strtok(NULL,",\n");
i++;
}

fclose(fp);

for(i=0;i<3;i++)
{
printf("番号=%d",score[i].no);
printf(" 点数=%d",score[i].ten);
printf(" 判定=%s\n",score[i].hantei);
}

return 0;
}


です。
実行すると

番号=1 点数=100 判定=ツ
番号=2 点数=50 判定=可
番号=3 点数=60 判定=可

と、なって、char部分がうまくいきません。
全部“可”が読み込まれてしまいます。

知識ほとんどなしで、なんとかここまで作ってみたんですが。

ご指摘ください。
どうぞよろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:CSVファイルを読み込んでstrtokで分解した後、出力するには? 30099 bugs 2007/05/10 20:59:29


No.30099

Re:CSVファイルを読み込んでstrtokで分解した後、出力するには?
投稿者---bugs(2007/05/10 20:59:29)


構造体定義のhanteiを、ポインタではなく
成績の文字数を十分格納できるだけの大きさの配列にしてください。

そして、hanteiにstrtok()の結果を格納する際は、
普通の代入ではなくstrcpy()を使ってください。

そうすれば、うまくいくでしょう。



この投稿にコメントする

削除パスワード

No.30102

Re:CSVファイルを読み込んでstrtokで分解した後、出力するには?
投稿者---亀吉(2007/05/10 22:46:18)


できました! ありがとうございます!!!
これがわからず、次のステップに進めず、
ずっと悩んでいたので解決してすっきりしました。
本当にありがとうございました。


この投稿にコメントする

削除パスワード

No.30109

Re:CSVファイルを読み込んでstrtokで分解した後、出力するには?
投稿者---yoh2(2007/05/10 23:49:00)


ひとつおまけ。
FAQ中のFAQですが、strtok()には
  • 連続したデミリタはまとめてひとつとして数えられる
  • 文字列の最初のデリミタは読み飛ばされる
といった性質があるので、空要素を持つCSVをうまく扱えないことに注意。
例えば、
    #include <stdio.h>
    #include <string.h>

    int main()
    {
        char str[] = ",,,abc,ABC,,123";
        char *token;

        for(token = strtok(str, ","); token != NULL; token = strtok(NULL, ",")){
            printf("token = %s\n", token);
        }
        return 0;
    }

というコードを書くと、結果は、
    token = 
    token = 
    token = 
    token = abc
    token = ABC
    tokon = 
    token = 123
となるのではなく
    token = abc
    token = ABC
    token = 123
となります。
strtok()って、CSVのようなものを読み込むためのものではなく、例えば
       1       2       3
     100     200     300
12345678   50000      30

と、空白で整形されたテキストを読み込んで、
一行目: "1", "2", "3"
二行目: "100", "200", "300"
三行目: "12345678", "50000", "30"
という文字列を簡単に取り出せるようにと設計された関数ですので。


この投稿にコメントする

削除パスワード

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