2011-01-11 14 views

答えて

0

数字はどのようにコード化されていますか?

ASCIIの場合は、複数の文字が必要です。ループを書くことができますが、fscanfヘルプがあります。

バイナリデータの場合、fgetcは8ビットしか読み込まないということを覚えておいてください。もう一度効率的に行うには他の機能について考える必要があります。ここ

ポイントは本当にあなたがちょうどあなたのfgetcはおそらく間違った答えであることを証明するためにそれをやっている場合を除きということです。たぶんfgets

0

fgetc()は、文字を「符号なしの文字」として解釈しますが、intにキャストします(ただし、ファイルの最後に-1のEOFを返します)。

ソースファイルにという表現の符号付き値のが含まれている場合は、それをデコードする必要があります。

4

fgetcは、一度に1文字ずつ読み込みます。ファイルまたは任意の番号から負の数を読み取ろうとする場合は、fscanfを使用します。

#include <stdio.h> 

main() 
{ 
    int v; 
    fscanf (stdin, "%d", &v); 
    printf ("v = %d\n", v); 
} 
0

'0' '1'、ASCII値0x30のを持っている0x31である...と、これまで... はあなたのファイルに一つだけの数を持っていると仮定すると:私は

FILE * pFile; 
    int c, n = 0; 
    bool negative; 
    pFile=fopen ("myfile.txt","r"); 
    if (pFile==NULL){ 
     perror("Error opening file"); 
    }else{ 
     c = fgetc (pFile); 
     negative = (c == '-'); 
     do { 
      c = fgetc (pFile); 
      if (c>=0x30 && c<=0x39) { 
     n = n*10 + (c-0x30); 
     } 
     } while (c != EOF); 
     fclose (pFile); 
    } 
    if(negative==true) n=n*-1; 
    printf ("Your number: %d\n",n); 
0

チャーリーとの比較では、fgetcを複数回呼び出すよりもはるかに優れた方法がありますが、その関数の使用を主張する場合は、各charを評価するループを実行する必要があります。また、データのエンコード方法にも依存します。それがアスキーの場合(charを返すfuncを使用する場合)、最初のcharが " - "であるかどうかを確認し、その後の各charをatoi(con​​st char *)でintに一度に1つずつ変換し、新たな値を追加する前に、結果の値を各反復ごとに10ずつ戻します。より良い方法は、いくつかの文字(fgetsか何かを使用して)を読み込み、次にchar *をatoi(con​​st char *)で変換することです。たぶんあなたがより明確に説明した場合、より良い答えを出そうとしていたものが提供される可能性があります。指定したとおりにデータがフォーマットされていないと、fscanfの使用が失敗することに注意してください。しかし、fscanfは本当にこの問題のあなたの答えです。

1

タイトルの「構造」がバイナリを意味する場合、おそらくfread()を使用したいと思うかもしれませんが、実際にバイナリファイルに格納されている整数のレイアウトが何であるかという質問を追跡しているなら、 fgetc()。

このコードは、ユニオンを使用して一連の読み取りバイトを整数に戻す方法を示しています。

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

union Integer 
{ 
    int intPart_; 
    char charPart_[4]; 
}; 


int main(int argc, char* argv[]) 
{ 
    FILE* pFile = fopen("integerFile.dat", "w"); 

    int intWritten = -257; 
    size_t bytesWritten = fwrite(&intWritten, 1, sizeof(int), pFile); 
    assert(bytesWritten == sizeof(int)); 
    fclose(pFile); 

    pFile = fopen("integerFile.dat", "r"); 
    int intRead = 0; 
    size_t bytesRead = fread(&intRead, 1, sizeof(int), pFile); 
    assert(bytesRead == sizeof(int)); 
    printf("%d\n", intRead); 
    fclose(pFile); 

    pFile = fopen("integerFile.dat", "r"); 
    Integer intToRead; 
    for(int i = 0; 
     i != sizeof(int); 
     ++i) 
    { 
     int byteRead = fgetc(pFile); 
     intToRead.charPart_[i] = byteRead; 
     printf("%d\n", byteRead); 
    } 
    printf("%d\n", intToRead.intPart_); 


    fclose(pFile); 


    return 0; 
} 
0

なしオーバー/アンダーフローチェックあなたは、戻り値のチェックWITH fscanfを使用することができます。

#include <stdio.h> 

int main() 
{ 
    int v; 
    if(1==fscanf(yourfilepointer, "%d", &v)) 
    printf ("v = %d\n", v); 
    else 
    fputs("error on reading v",stderr); 
    return 0; 
} 
関連する問題