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

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

 詳しくはこちら



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

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


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

No.18786

fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---Y.M(2004/12/17 16:57:02)


バイナリファイルとテキストファイルへの出力はきちんとできているのですが、
得点・合計得点出力のところでつまづいてしまいます。
どうすればいいでしょうか?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct{       /*出力レイアウト*/
    char name[20];
    int  ten[3];
}RECORD;

void create_bin_file(char *);
void copy_bin_to_csv(char *,char *);
void display_csv_file(char *);

FILE *fpbin, *fpcsv;                    /*FILE構造体(グローバル変数)*/

void main(int argc, char **argv)
{
    if (argc != 3){
        printf("コマンドライン引数に誤りがあります。\n");
        printf("Usage:a.out filename1 filename2\n");
        exit(EXIT_FAILURE);
    }
    
    create_bin_file(argv[1]);         /* キーボード            ⇒ バイナリィファイル         */
    copy_bin_to_csv(argv[1],argv[2]);   /* バイナリィファイル      ⇒ CSV(テキスト)ファイル */
    display_csv_file(argv[2]);      /* CSV(テキスト)ファイル  ⇒ ディスプレィ       */
}

/*
*   キーボードから入力したデータを構造体レコード(バイナリィ)にしてファイル出力する
*/
void create_bin_file(char *filename)
{
    RECORD seiseki;
    int i;
    int ten;
    /*ファイルを出力(バイナリィファイル)モードでオープンする(要エラーチェック!)*/
    if((fpbin = fopen(filename,"w+b")) == NULL){ 
        printf("error\n");
        exit(1);
    }
    /*gets()で氏名にctrl+z(戻り値=Null)が入力されるまで処理を繰り返す*/
    while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){
         /*氏名にctrl+z以外が入力された場合、得点1、得点2、得点3を入力する。*/
        if(seiseki.name != NULL){
            for(i = 0; i < 3;i++){
                printf("得点%d >", i + 1);
                scanf("%d", &seiseki.ten[i]);
            }
        }   
        fprintf(fpbin,"%s %d %d %d ", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]);     
        /*構造体レコードを1件ずつ出力(要エラーチェック!)*/
        printf("name:%s 得点1:%d 得点2:%d 得点3:%d\n", seiseki.name, seiseki.ten[0], seiseki.ten[1], seiseki.ten[2]);
        rewind(stdin);          /* キーボードバッファのクリア*/
    }
      
    /*ファイルクローズ*/
    fclose(fpbin);
}

/*
*   構造体レコード(バイナリィ)ファイルをCSV(テキスト・カンマセパレート形式)ファイルに変換する
*/
void copy_bin_to_csv(char *infile,char *outfile)
{
    RECORD seiseki;
    
    /*ファイルを入力(バイナリィファイル)モードでオープンする(要エラーチェック!)*/
    if((fpbin = fopen(infile,"rb")) == NULL){ 
        printf("error\n");
        exit(1);
    }
    /*ファイルを出力(テキストファイル)モードでオープンする(要エラーチェック!)*/
    if((fpcsv = fopen(outfile,"w+")) == NULL){ 
        printf("error\n");
        exit(1);
    }
    /*構造体レコードをEOFまで1件ずつ入力(要エラーチェック!)*/
    while(fscanf(fpbin,"%s%d%d%d", &seiseki.name[0], &seiseki.ten[0],&seiseki.ten[1],&seiseki.ten[2]) != EOF)
        /*入力した構造体のメンバ間に','を挿入しファイルへ出力(要エラーチェック!)*/
        fprintf(fpcsv,"%s, %d,%d,%d,\n", seiseki.name, seiseki.ten[0], seiseki.ten[1], seiseki.ten[2]);
        
    /*ファイルクローズ*/
    fclose(fpbin);
    fclose(fpcsv);
    
}

/*
*   CSV(テキスト・カンマセパレート形式)ファイルをトークンに分けて表示し、合計を計算表示する
*/
void display_csv_file(char *filename)
{
    char    buf[255];
    int     i, sum, tokkuten[3];
    
    /*ファイルを入力(テキストファイル)モードでオープンする(要エラーチェック!)*/
    if((fpcsv = fopen(filename,"r+")) == NULL){ 
        printf("error\n");
        exit(1);
    }
    /*見出し部表示*/
     
    /*CSVレコードをEOFまで1件ずつ入力(要エラーチェック!)*/
   while(fscanf(fpcsv,"%s%d%d%d", &buf[0], &tokkuten[0],&tokkuten[1],&tokkuten[2]) != EOF){
        /*名前表示*/
        strtok(buf,",");
        printf("name:%s ",buf); 
        /*得点表示&合計計算*/
        printf("得点1:%d 得点2:%d 得点3:%d", tokkuten[0],tokkuten[1],tokkuten[2]);
        sum = tokkuten[0] + tokkuten[1] + tokkuten[2];
        /*合計表示*/
        printf(" 合計得点: %d\n", sum);
    }
    /*ファイルクローズ*/
    fclose(fpcsv);
    
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!! 18787 επιστημη 2004/12/17 17:01:28
<子記事> Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!! 18791 Roy.O 2004/12/17 18:25:57
<子記事> Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!! 18792 Hermit 2004/12/17 18:36:02
<子記事> Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!! 18799 mo 2004/12/19 00:15:51


No.18787

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---επιστημη(2004/12/17 17:01:28)


> 得点・合計得点出力のところでつまづいてしまいます。
> どうすればいいでしょうか?

なにが/どのようにつまづくのかを説明しましょう。



この投稿にコメントする

削除パスワード

No.18791

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---Roy.O(2004/12/17 18:25:57)


>/*入力した構造体のメンバ間に','を挿入しファイルへ出力(要エラーチェック!)*/
>fprintf(fpcsv,"%s, %d,%d,%d,\n", seiseki.name, seiseki.ten[0], seiseki.ten[1], seiseki.ten[2]);

>/*CSVレコードをEOFまで1件ずつ入力(要エラーチェック!)*/
>while(fscanf(fpcsv,"%s%d%d%d", &buf[0], &tokkuten[0],&tokkuten[1],&tokkuten[2]) != EOF){

この2箇所の記述内容の書式が一致していないのが原因だと思います。

fprintf(fpcsv,"%s %d %d %d \n", seiseki.name, seiseki.ten[0], seiseki.ten[1], seiseki.ten[2]);

while(fscanf(fpcsv,"%s %d %d %d \n", &buf[0], &tokkuten[0],&tokkuten[1],&tokkuten[2]) != EOF){

両者とも上のような同じフォーマットで指定すればいけるはずです。



この投稿にコメントする

削除パスワード

No.18792

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---Hermit(2004/12/17 18:36:02)


fscanf で、読みきれていないと思います。

名前のあと 空白で次の数値が読めるようですが、
その次は、エラーになって読みきれていないので、
次の名前に、2教科目と3教科目の点数が入ると思います。

素直に、fgets で行読み込みして、
strtok で切り分け、atoi strtol sscanf などで
数値にしたほうがいいと思われます。


この投稿にコメントする

削除パスワード

No.18796

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---Q児(2004/12/18 12:27:39)


>素直に、fgets で行読み込みして、
>strtok で切り分け、atoi strtol sscanf などで
>数値にしたほうがいいと思われます。
試してみたけどイマイチうまくいきません。
具体的にどのように記述すればいいのでしょうか?



この投稿にコメントする

削除パスワード

No.18797

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---ぽこ(2004/12/18 12:34:10)


Y.Mさん=Q児さんですか?

>試してみたけどイマイチうまくいきません。
>具体的にどのように記述すればいいのでしょうか?

具体的にどのように記述して、どのように上手く行かないか書きましょう。
【掲示板ご利用上の注意】にもあるように、「※環境(OSとコンパイラ)や症状は具体的に詳しく!」
です。



この投稿にコメントする

削除パスワード

No.18798

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---Hermit(2004/12/18 14:12:02)


かなり、手抜きです

/*
*   CSV(テキスト・カンマセパレート形式)ファイルをトークンに分けて表示し、合計を計算表示する
*/
void display_csv_file(char *filename)
{
    char    buf[255];
    int     i, sum, tokkuten[3];
    
    /*ファイルを入力(テキストファイル)モードでオープンする(要エラーチェック!)*/
    if((fpcsv = fopen(filename,"r+")) == NULL){ 
        printf("error\n");
        exit(1);
    }
    /*見出し部表示*/
     
    /*CSVレコードをEOFまで1件ずつ入力(要エラーチェック!)*/
   while(fgets(buf,sizeof(buf),fpcsv)){
        char *tmp;
        /*名前表示*/
        strtok(buf,",");
        for (i = 0;tmp = strtok(NULL,",");i++) {
            tokkuten[i] = atoi(tmp);
        }
        /*得点表示&合計計算*/
        printf("名前 %s 得点1:%d 得点2:%d 得点3:%d",buf, tokkuten[0],tokkuten[1],tokkuten[2]);
        sum = tokkuten[0] + tokkuten[1] + tokkuten[2];
        /*合計表示*/
        printf(" 合計得点: %d\n", sum);
    }
    /*ファイルクローズ*/
    fclose(fpcsv);
    
}



この投稿にコメントする

削除パスワード

No.18806

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---Q児(2004/12/19 13:10:56)


strtok(NULL,",");の処理の解読に少し時間がかかりましたがよく分かりました。一応、そのやりかた以外にfprintfとfscanfの書式をあわせて行うとうまくいきました。本当にありがとうございます。
ちなみにY.M=Q児です。


この投稿にコメントする

削除パスワード

No.18799

Re:fprint()とfscanf()処理を用いたプログラムがうまくいきません!!
投稿者---mo(2004/12/19 00:15:51)


http://okweb.jp/kotaeru.php3?q=1132040


この投稿にコメントする

削除パスワード

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