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

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

 詳しくはこちら



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

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


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

No.18999

ファイル入出力
投稿者---SOS(2005/01/04 11:07:58)


下記のプログラムはテキストファイルで読み込んだものを構造体にし、構造体にしたもののオペコードに入った命令の数を数えるプログラムです。
テキストファイルの中身(ras.txt)は「add r1 r2 r3」,「sub r4 r5 r6」です。
オペコードに入った命令がなくなるまで読みたいのですが、見当がつきません。
どのようにすればよいのでしょうか?
教えてください。

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

struct youso{   /* 構造体の宣言 */
    char opecode[20];   
    char operand0[20];  
    char operand1[20];  
    char operand2[20];  
};

int goukei(int x);

int main(int argc, char *argv[])
{
    FILE *fp;
    int clock=0;

    fp=fopen("ras.txt", "r");

    if(fp==NULL){
        printf("ファイルをオープンできませんでした\n");
        return 1;
    }else{
        printf("ファイルをオープンしました\n");
    }

    clock=goukei(clock);

    printf("合計は%dです\n",clock);

    fclose(fp);

    return 0;
}

int goukei(int clock)
{
    int i;
    char line[100];
    struct youso y[20]; /* 構造体変数と構造体配列の宣言 */ 

    /* 構造体配列に scanf()でデータを入力 */
    for(i = 0; i < n; i++) {
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%s", y[i].opecode);
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%s", y[i].operand0);
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%s", y[i].operand1);
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%s", y[i].operand2);
        
    /* 入力データの確認 */
        if(i==0){
            printf("opecode:%s operand0:%s operand1:%s operand2:%s\n", 
                y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2);
        }else{
            printf("opecode:%s operand0:%s operand1:%s operand2:%s p_opecode:%s\n", 
                y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2, y[i-1].opecode);
        }

        /* オペコード */
        if(strcmp(y[i].opecode,"add")==0){
                printf("%dです\n",clock+1);
                clock=clock+1;
        }else{ 
                printf("%dです\n",clock);
        }
     }

    return clock;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル入出力 19000 あかま 2005/01/04 12:05:49


No.19000

Re:ファイル入出力
投稿者---あかま(2005/01/04 12:05:49)


では、読み込みのとこだけ。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct youso{   /* 構造体の宣言 */
    char opecode[20];   
    char operand0[20];  
    char operand1[20];  
    char operand2[20];  
};

int goukei(int x,FILE *fp);

int main(int argc, char *argv[])
{
    FILE *fp;
    int clock=0;

    fp=fopen("ras.txt", "r");

    if(fp==NULL){
        printf("ファイルをオープンできませんでした\n");
        return 1;
    }else{
        printf("ファイルをオープンしました\n");
    }

    clock=goukei(clock,fp);

    printf("合計は%dです\n",clock);

    fclose(fp);

    return 0;
}

int goukei(int clock,FILE *fp)
{
    int i,num;
    char line[100];
    struct youso y[20]; /* 構造体変数と構造体配列の宣言 */ 

    /* 構造体配列に scanf()でデータを入力 */
    for(num = 0; num < 20; num++) {
        if(fgets(line, sizeof(line), fp) == NULL) break;
        if(sscanf(line, "%s %s %s %s", y[num].opecode, y[num].operand0, y[num].operand1,y[num].operand2) < 4) break;
    }
    
    for(i = 0; i < num; i++){
        printf("opecode:%s operand0:%s operand1:%s operand2:%s \n", 
            y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2);
    }
    return clock;
}




この投稿にコメントする

削除パスワード

No.19003

Re:ファイル入出力
投稿者---SOS(2005/01/04 14:00:37)


visualC++を使っているのですが、テキストファイルとソースファイルをビルドしても思うように出力されません。
ビルドの順番があるのでしょうか。
知っている方、教えてください。


この投稿にコメントする

削除パスワード

No.19004

Re:ファイル入出力
投稿者---あかま(2005/01/04 14:11:51)


>visualC++を使っているのですが、テキストファイルとソースファイルをビルドしても思うように出力されません。
>ビルドの順番があるのでしょうか。
>知っている方、教えてください。
テキストファイルというのはプログラム中で読み込んでいるras.txtのことですか?
これはソースファイルと同じフォルダに置いておけばいいだけで、ビルドする必要はありません。



この投稿にコメントする

削除パスワード

No.19005

Re:ファイル入出力
投稿者---SOS(2005/01/04 14:22:11)


>これはソースファイルと同じフォルダに置いておけばいいだけで、ビルドする必要はありません。

あかま様、ありがとうございます。
解決することができました。

ついでなのですが、今のプログラムは「オペコード、オペランド0、オペランド1、オペランド2」というように「add r1 r2 r3」を読むことができましたがオペランド2が空白の場合、すなわち「add r1 r2」でも読めるようにしたいのですが、どのようにすればよいのでしょうか。
わかる方、教えてください。



この投稿にコメントする

削除パスワード

No.19007

Re:ファイル入出力
投稿者---あかま(2005/01/04 15:51:50)


int i,num,n;

if((n = sscanf(line, "%s %s %s %s", y[num].opecode, y[num].operand0, y[num].operand1,y[num].operand2)) < 3) break;
else if(n == 3){
    y[num].operand2[0] = '\0';
}



この投稿にコメントする

削除パスワード

No.19014

Re:ファイル入出力
投稿者---SOS(2005/01/04 18:07:23)


無事に解決することができました。
あかま様、ありがとうございました。


この投稿にコメントする

削除パスワード

No.19008

Re:ファイル入出力
投稿者---επιστημη(2005/01/04 15:54:34)


> オペランド2が空白の場合、すなわち「add r1 r2」でも読めるようにしたいのですが、どのようにすればよいのでしょうか。

sscanfの戻り値で判断できるんじゃないでしょか?
ドキュメントを読み、試してください。



この投稿にコメントする

削除パスワード

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