ページ 11

テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 17:49
by シノニム
こんにちわ。今回はファイルの扱いについて質問したいと思います

現在音ゲーを作っていて、譜面を作成する関数をやっと作れたんですが、保存したテキストデータを読み込むところが難しくて悩んでいます

テキストファイルには、

143:1
現在の時間(?):音符の場所

FIRST:235:3
識別コード:時間:場所

こんな感じに入力されているんですが、『:』で区切って時間と場所を別々の変数に格納したいと思ってます
FIRSTの部分はchar型で、時間と場所はint型で出力したいです
どうやって判別させればいいのかが分かりません

どなたかお力添えをお願いします

OS:WindowXP
言語:C++(しかし読み込む際にはfscanfを使用したい)

Re:テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 18:08
by バグ
書式指定でなんとかなりそうです。
以下サンプルです。
#include <stdio.h>

void main(void)
{
    char* text = "test:1234:5678";
    char s1[10];
    int a = 0, b = 0;
    sscanf(text,"%[^:]:%d:%d", s1, &a, &b);
    printf("%s\n", text);
    printf("%s\n", s1);
    printf("%d\n", a);
    printf("%d\n", b);
}

Re:テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 18:10
by たかぎ
> FIRSTの部分はchar型で、時間と場所はint型で出力したいです
> どうやって判別させればいいのかが分かりません

"FIRST"をchar型のオブジェクトに格納することは、一般的にはできません。
判別については、いったん文字列で入力し、意味を解析しながら目的の型になるように変換するとよいでしょう。

Re:テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 23:12
by test
#include <stdio.h>



void main(void)

{
    FILE *fp;
    fp = fopen("EASY.txt","r");
    char* text;

    fscanf_s(fp, "%s", &text);

    char s1[10];

    int a = 0, b = 0, c = 0, d = 0, e = 0;

    sscanf(text,"%[^:]:%d:%d,%d,%d,%d", s1, &a, &b, &c, &d, &e);

    printf("%s\n", text);

    printf("%s\n", s1);

    printf("%d\n", a);

    printf("%d\n", b);

    printf("%d\n", c);

    printf("%d\n", d);

    printf("%d\n", e);
    
    fclose(fp);
}
<\pre>

Re:テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 23:16
by シノニム
すいません上の記事自分です・・・

ソースコードを初めて乗せるので、文字下げしようとしたんですが、こういうの初めてなのでテストしようとした結果です・・・

バグさんのソースを参考にしてこのように作っていじってみたんですが、実行すると何も表示されなくなってしまいました。どうすれば直りますかね・・・

追記:ソースコードの囲み方も教えていただけませんでしょうか・・・(´・ω・`)

Re:テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 23:19
by たかぎ
> 追記:ソースコードの囲み方も教えていただけませんでしょうか・・・(´・ω・`)

とりあえずこれだけ。
普通に、
<pre>
...
</pre>
のように囲むだけです(<と>は半角)。
最後は、\preではなく、/preです。

Re:テキストファイルからの読み込みについて

Posted: 2009年12月17日(木) 23:58
by Dixq (管理人)
>>シノニムさん

こんばんは^^
音ゲーですか、私も今音ゲー作っていますが、音ゲー作り楽しいですよね☆

さて、読み込み方は色々あって、
形式が完全に決まっているならバグさんのような方法が良いでしょうし、
区切る文字が決まっていて、その形式が不定なら
strtok
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
を使うのもよいでしょう。
また、一文字読み込みつつ、「:」が来たら別の文字列に格納する関数を自作するのも良いと思います。

私としては最後の自作がお勧めです。
私は「初心者は標準関数をなるべく使うな」と教えられました。
関数を作ることは良い勉強になるんですよね。

ところで、投稿する前に確認したい時は「プレビュー」にチェックいれて投稿するとよいですよ。

Re:テキストファイルからの読み込みについて

Posted: 2009年12月18日(金) 08:47
by non
FIRST:235:3
識別コード:時間:場所

143:1
現在の時間(?):音符の場所

とのことですが、実際のデータでは

FIRST:315:1
SECOND:407:3,2
THERD:516:4,3,2
965:3
1013:2
1052:1
(途中略)
1976:4
FINISH:2046
COMBO:50

sscanfを使うなら、データの形式がはっきりしてないと、いけません。
データのフォーマットを正確に示してください。
場所はカンマ区切りで何個後ろに続くか不明なのですね。
識別コードか現在の時刻を表す行の違いは文字か数字かの違いでしょうか?

Re:テキストファイルからの読み込みについて

Posted: 2009年12月18日(金) 20:18
by シノニム
>> たかぎさん
なるほど・・・スラッシュとバックスラッシュを間違えてましたorz
ご指摘、ありがとうございます

>> 管理人さん
音ゲー作りは今回が初めてなんですが、かなり楽しいです!
strtok関数ですか・・・んー初めて聞く関数です(無知ですいません・・・)
管理人さんが言うように、一度独自に関数作成を試みて、もし折れてしまった際に頼ってみます!

-> 投稿する前に確認したい時は「プレビュー」にチェックいれて投稿するとよいですよ。
そうなんです・・・チェックしようと思っていたんですが忘れてしまいまして。今度から気をつけます

>> nonさん
sscanfをいじっていて分かったんですが(上記のソースで)、
void main(void)
{ 
    char* text = "SECOND:256:2,3"; 


    char s1[10]; 

    int a = 0, b = 0, c = 0, d = 0, e = 0; 

    sscanf(text,"%[^:]:%d:%d,%d,%d,%d", s1, &a, &b, &c, &d, &e); 

    printf("%s\n", text); 

    printf("%s\n", s1); 

    printf("%d\n", a); 

    printf("%d\n", b); 

    printf("%d\n", c); 

    printf("%d\n", d); 

    printf("%d\n", e); 

    fclose(fp); 
}
このようにしたところ、変数bまではしっかり代入されて、c、d、eは0で初期化された状態でした。
エラーが出なかったので、これを応用して、nonさんの懸念していた問題は解決できそうです。

->識別コードか現在の時刻を表す行の違いは文字か数字かの違いでしょうか?
これを説明すると、ゲームの核部分を事細かに説明しなければならないので、失礼ながら省略させて頂きました。すいません。そしてありがとうございました


しかしながら、
#include <stdio.h>



void main(void)

{
    FILE *fp;
    fp = fopen("EASY.txt","r");
    char* text;

    fscanf_s(fp, "%s", &text);

    char s1[10];

    int a = 0, b = 0, c = 0, d = 0, e = 0;

    sscanf(text,"%[^:]:%d:%d,%d,%d,%d", s1, &a, &b, &c, &d, &e);

    printf("%s\n", text);

    printf("%s\n", s1);

    printf("%d\n", a);

    printf("%d\n", b);

    printf("%d\n", c);

    printf("%d\n", d);

    printf("%d\n", e);
    
    fclose(fp);
}
なぜこのソースでテキストデータを読み込んでくれないのかが分かりません・・・
エラーは出ないんですが(´・ω・`)

Re:テキストファイルからの読み込みについて

Posted: 2009年12月18日(金) 20:46
by non
>エラーが出なかったので、これを応用して、nonさんの懸念していた問題は解決できそうです。

そんな、単純な問題ではないと思う。

>char* text;
>fscanf_s(fp, "%s", &text);

char text[80];
fscanf_s(fp,"%s",text);

Re:テキストファイルからの読み込みについて

Posted: 2009年12月19日(土) 17:30
by シノニム
なんとか解決できました!助けてくださった皆様、ありがとうございました!