ここから本文です

c言語の課題で、input.txt に入力された 8bit の 2 つのデータを取り込み、最初の ...

ras********さん

2018/10/2511:39:29

c言語の課題で、input.txt に入力された 8bit の 2 つのデータを取り込み、最初の 8bit を

上位ビット、あとの 8bit を下位 bit とする 16bit の整数を出力するプログラムを作成せ
よ。と出たのですが、出来ません。どなたかおしえてください。画像はinput.txt の中身です。
#include<stdio.h>
int main(){
int a,b[8]={0,0,0,0,0,0,0,0};
int c ,d[8]={0,0,0,0,0,0,0,0};
int i,x;
FILE *fp;
fp = fopen("input.txt","r");
if(fp==NULL){
printf("file open failed.\n");
return -1;
}
for(i=7;i>=0;i--){
fscanf(fp,"%d",&b[i]);
}
for(i=7;i>=0;i--){
fscanf(fp,"%d",&d[i]);
}

fclose(fp);
for(i=0;a>0;i++){
b[i]=a%10;
a=a*10;
}
for(i=0;c>0;i++){
d[i]=c%10;
c=c*10;
}
printf("num1=%d\n",a);
printf("num2=%d\n",c);

printf("0b(%d %d)=%d\n",b[i],d[i],x);
}
<ターミナル上での実行例>
num1 = 21
num2 = 129
0b(00010101 10000001) = 5505

fscanf,printf,input.txt,0 0 0 0 0,num2,%d&amp;quot,strtol

閲覧数:
25
回答数:
2

違反報告

ベストアンサーに選ばれた回答

roc********さん

2018/10/2514:06:50

折角作ったソースコードがあるのでなるべく変更量の少ない形で修正点を挙げてみますね

①"%d"では正常には読めない
NG: fscanf(fp,"%d",&b[i]);
NG: fscanf(fp,"%d",&d[i]);

fscanf を "%d" で読み込むと、つながっている数字はまとめて読まれてしまいます
繋がっている数字を1文字ずつ読みたい場合は "%1d" と書きます
fscanf(fp,"%1d",&b[i]);
fscanf(fp,"%1d",&d[i]);

②ループの継続条件が不味い
NG: for(i=0;a>0;i++){
NG: for(i=0;c>0;i++){

ここは 8 ビット分処理すると決まっているので(a>0やc>0ではなく) i<8 で良い
for(i=0;i<8;i++){
for(i=0;i<8;i++){

③初期化されてない
int a
int c

0で初期化しましょう

④2進数(ビット)を組み立てる計算になっていない
NG: b[i]=a%10;
NG: a=a*10;
NG: d[i]=c%10;
NG: c=c*10;

10倍したら10進数になってしまいます
ここはこのように計算します
a|=b[i]<<i;
c|=d[i]<<i;

⑤x を計算していない

x は num1 と num2 を繋げる計算です
ここはこのように計算します
x = a << 8 | c;

⑥ビット列は"%d"などで単純に出力することはできない
NG: printf("0b(%d %d)=%d\n",b[i],d[i],x);

ビット列はループして出力します
printf("0b(");
for(i=7;i>=0;i--)printf("%d",b[i]);
printf(" ");
for(i=7;i>=0;i--)printf("%d",d[i]);
printf(")=%d\n",x);

ベストアンサー以外の回答

1〜1件/1件中

pis********さん

2018/10/2512:24:10

簡単に書けば次のような形になります。
int16_t は 16 ビット整数を表す型です。ファイルから上位 8 ビットを読み込み、strtol で数値に変換した後左に 8 ビットシフトし、result に取り込んでいます。下位 8 ビットはシフトせずにそのまま result に取り込んでいます。
ファイル読み込みのエラー処理は省略していますので、必要ならエラー処理を付けてください。

--
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define FILE_NAME "input.txt"
#define BUF_SIZE 16

int main(void) {
    int16_t result = 0;

    FILE *fp = fopen(FILE_NAME, "r");
    char buf[BUF_SIZE];
    // 上位 8 ビット取得
    fgets(buf, BUF_SIZE, fp);
    result = result | (strtol(buf, NULL, 2) << 8);
    // 下位 8 ビット取得
    fgets(buf, BUF_SIZE, fp);
    result = result | strtol(buf, NULL, 2);
    fclose(fp);

    printf("%d", result);

    return 0;
}

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる