3

ファイルから次のバイナリ (01100001) を読み取って ASCII コード (97) に変換しようとしていますが、fread を使用すると非常に大きな数値が得られます。ファイル「c:/input.txt」には次の行のみが含まれます -01100001 配列値の printf は、825241648 などの大きな数値を出力します

私のコード:

int main()
{
    unsigned int arr[8];
    int cnt,i,temp=0;
    FILE * input;
    if(!(input=fopen("C:/input.txt","r")))
    {
        fprintf(stderr,"cannot open file\n");
        exit(0);
    }
    cnt = fread(arr,1,8,input);
    for(i=0;i<cnt;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

理由はありますか?

4

3 に答える 3

3

arr整数の配列です。しかし、そこには 8 バイトしか読み込まれません。したがって、最初の整数には大きな値があり、2 番目の整数にも大きな値がありますが、その後はガベージ値になります。(arrスタックに割り当てられる「自動」変数を作成したため、ランダムなガベージが含まれます。静的変数にすると、事前にゼロバイトに初期化されます。)

arrタイプが になるようにの宣言を変更するcharと、文字列を読み込むことができ、forループはそれらのバイトを一度に 1 つずつループします。

次に、文字列からバイナリへのトランスレータを作成するかstrtol()、ベースを 2 に設定して変換を行うために 使用できstrtol()ます。すべてのコンパイラで使用できるわけではありません。GCC は問題ありませんが、Microsoft C にはありません。

于 2012-07-04T10:17:03.990 に答える
2

Pl。以下のコード (Linux で gcc を使用してコンパイル) がこれに対して機能するかどうかを確認してください。

#include<stdio.h>
#include<stdlib.h>
int main()
{
 char  arr[8];
 int cnt,i,temp=0;
 FILE * input;

if((input=fopen("data","r"))==NULL)
{
        fprintf(stderr,"cannot open file\n");
        exit(1);
}
 //Read the 8 bytes in a character array of size 8
 cnt = fread(arr,1,8,input);
 for (i = 0; i < cnt; i++)
 {
        //Now change it to 0/1 form by substracting 48
        arr[i] = arr[i] - '0';/* Ascii of 0 = 48*/
        //Also Left shift..
        arr[i] = arr[i] << (cnt - (i+1));
        //Now Bit wise OR with the integer...
        temp = temp | arr[i];
 }
  printf("The ascii value is %d and the character is %c\n", temp, temp);
  return 0;

}

于 2012-07-04T11:48:25.217 に答える
1

unsigned int arr[8];最初に、これは8つの整数、より正確には8 * 4=32バイトを意味することを宣言します。その後、8バイトを読み取り、8つの整数を出力してみます。8バイトを読み取って数値として出力したいと思いますか?タイプintをに変更するとchar、コードが機能する可能性があります。ファイルサイズが32バイトで整数が含まれている場合は、次のようにfread()を変更できます。fread(arr,sizeof(int),8,input);

于 2012-07-04T10:10:37.163 に答える