CSVファイルの読み込みについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

CSVファイルの読み込みについて

#1

投稿記事 by » 14年前

申し訳ありませんが、また質問させて頂きます。

現在、C++とDXライブラリを使ってタイピングクイズゲームを作っています。
以下のページを参考に、問題と解答をエクセルファイルで管理してデータを読み込ませる手法を行っています。
ttp://dixq.net/rp/11.html

1.CSVファイルから「問題」と「解答」のデータを読み込み、各配列に格納。
2.「問題」を出題。
3.KeyInputStringを用いて答えさせる。
4.「入力された答え」と「解答」が同じなら正解判定、異なるなら不正解判定。

この様な流れで組んでいます。

しかし、(前回質問したのとは違う理由でまたもや)正解でも正解判定になりません。

そこで、問題・解答・入力された答えの中身を1バイトずつ拾ってみたところ、以下の様になりました。

問題: [文字列],0
解答: [文字列],13,0
入力: [文字列],0

判り難いと思いますが、解答にあたる文字配列にのみヌル文字「0」の前に「13」というコードが紛れ込んでいました。
そこで、解答を読み込む場合のみヌル文字を格納する配列を1つずらしてみたら解決できました。

調べてみたところ、「13」は「行頭復帰」を表すそうですが、何故これが入るのか判りません。
何故行頭復帰が入るのか、そして行頭復帰を根本から読み込ませない方法を教えてもらえたら幸いです。

以下、問題読み込みにあたるコードになります。
(上記の「解答を読み込む場合のみ、ヌル文字を格納する配列を1つずらす」処理を行っていないものです。)
/***********************************
    問題配列
***********************************/

    char mondaiQ[100][32];
    char mondaiA[100][32];

/***********************************
    問題読込
***********************************/

    int n,num;
    int input[32];
    char inputc[32];

    int fp = FileRead_open("ファイル名");//ファイル読み込み

    n=0,num=0;
    while(1){
        for(int i=0;i<32;i++){
            inputc=input=FileRead_getc(fp);//1文字取得する
            if(input=='/'){//スラッシュなら
                while(FileRead_getc(fp)!='\n');//改行までループ
                i=-1;//カウンタを最初に戻す
                continue;
            }
            if(input==','||input=='\n'){//カンマか改行なら
                inputc='\0';//そこまでを文字列とする
                break;
            }
            if(input==EOF){//ファイルの終わりなら
                goto EXFILE;
            }
        }
        switch(num){
            case 0: strcpy(mondaiQ[n],inputc);break;
            case 1: strcpy(mondaiA[n],inputc);break;
        }
        num++;
        if(num==2){
            num=0;
            n++;
        }
    }
EXFILE:
    FileRead_close(fp);


また、csvファイルの中身は以下のような構造になっています。

/問題,解答
もんだい1,かいとう1
もんだい2,かいとう2
もんだい3,かいとう3
・
・
・
(以下、100問まで同じ)


以上、宜しくお願い致します。 画像

toyo

Re:CSVファイルの読み込みについて

#2

投稿記事 by toyo » 14年前

FileRead_open関数の代わりに標準関数のfopenを使うといいと思います
Windowsの改行は\r\nの2バイトで10進数だと13と10です
C言語では改行は\nの1バイトで扱うためそのままだと不都合が起きます
そのためWindowsのfopenではテキストモードとバイナリモードの2種類のファイルオープンモードが用意されています
テキストモードでオープンするとファイル読み込み時には\r\nの2バイトが自動的に\n1バイトに変換され書き込み時には\nが\r\nの2バイトに自動的に変換されます
FileRead_open関数はバイナリモードでオープンされるためこの改行変換が行われません
fopen( )
fgetc( )
などを使いましょう

#include <stdio.h>
が必要です

Re:CSVファイルの読み込みについて

#3

投稿記事 by » 14年前

>toyo様

詳しい解説までして頂いてありがとうございます。
fopenを使って書き直してみたところ、見事に正常な動作をしました。
どうやら、今までDXライブラリに頼りすぎていたみたいです。
標準関数のfopenとDXライブラリのFileRead_openに、こんな仕様の違いがあったとは……。
小さく見えても重大な違いですね。
非常に助かりました。本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る