0

char、int、float を含む構造体を構築するには、ファイルからの単一の読み取りを使用する必要があります。文字は問題なく読み取ることができますが、intの読み取りに問題があります

CountryData ReadingFile(Directory* CountryDirectory,int SortedCountryData,char *Code,int NumberofCountries)
{
    int Location,i;  // Will store Location in array and location in bytes
    char Buff[40]; //Buffer the size of the stuct
    char Tok[25];
    CountryData Country;
    off_t offset;  //Offset value
    ssize_t count;

    Location = BinarySearch(CountryDirectory,Code,0,NumberofCountries-1); //Findlocation in array
    Location =CountryDirectory[Location].Offset; //Find location in bytes
    offset = lseek(SortedCountryData, Location, SEEK_SET); //Seek to location in file
    count = read(SortedCountryData,Buff,40); //Read file

     //Data in Buff should be Code[4],Name[25],int,float

    for(i=0;i<4;i++)//Get code
    {
    Tok[i] = Buff[i];
    }
    strncpy(Country.Code,Tok,sizeof(Country.Code));//Copy Code

    for(i=0;i<25;i++)//Get Name
    {
    Tok[i]=Buff[i+4];
    }
    strncpy(Country.Name,Tok,sizeof(Country.Name));//Copy Name

        //This is where I try to read the int
    char INTEGER[4];
    for(i=0;i<4;i++) //Read an int
    {
        INTEGER[i]=Buff[33+i];
    }
    int A =(int)INTEGER;
    printf("Tok: %d",A);

    return(Country);


}
4

4 に答える 4

1

ポインターの問題については @slugonamission が正しいと思いますが、問題を正しく理解していれば、int は int としてファイルに格納され、char 配列を扱っている理由は、あなたがあなたのやり方から強制されているからです。やってreadます。

これには memcpy を試してください。また、エンディアンの問題にも注意してください。

int A;
memcpy(&A, Buff + 33, 4 * sizeof(char))
于 2013-01-27T19:05:34.513 に答える
1

問題はINTEGER、それが配列であり、C のポインターに相当することです。そのため、それを にキャストするとint、値ではなくポインターがキャストされ、クレイジーな結果が得られます。ソリューション?intポインターにキャストしてから逆参照します。

int *A = (int *) INTEGER;
printf("Tok: %d",*A);

ショートカットとして、いくつかのポインター演算でループを回避できます。

int *A = (int *) (Buff + 33);
printf("Tok: %d",*A);

ただし、コピーが必要な場合はコピーを作成しません (を変更する予定がintあり、バッファーをそのまま保持したい場合など)。

于 2013-01-27T19:07:31.327 に答える
0

int と float が「バイナリ」コード化されていると仮定すると (書き込みあり)、次のようにします。

struct Data
{
    union 
    {
        char Buff[40];
        struct 
        {
            char Country_Code[4];
            char Name[25];
            int  A;  /* char A[5]; convert to int using atoi */
            float F; /* char F[6]; convert to float using atof */
        };
    };
};

CountryData ReadingFile(........)
{

    int Location,i;  // Will store Location in array and location in bytes
    CountryData Country;
    off_t offset;  //Offset value
    size_t count;

.....

    Data BUFF;
    count = read(SortedCountryData,BUFF.Buff,40); //Read file

     //Data in Buff should be Code[4],Name[25],int,float

    strncpy(Country.Code,BUFF.Country_Code,sizeof(Country.Code));//Copy Code
    strncpy(Country.Name,BUFF.Name,sizeof(Country.Name));//Copy Name
    int A =BUFF.A;
    printf("Tok: %d",A);
    return(Country);
}

しかし、int と float もコード化された文字列として (テキスト モードでは、5 と 6 文字で、しかしターミネータを含めて) ある場合、構造体で宣言をchar A[5]andchar F[6]に変更し、atoi と atof を使用して int または float に変換できます。それぞれ。

于 2013-01-27T23:06:51.623 に答える
-1
char INTEGER[4];
for(i=0;i<4;i++) //Read an int
{
    INTEGER[i]=Buff[33+i];
}
int A =(int)INTEGER;

この問題は、値を保持する配列に関連しています。C では、配列は自動的にポインターに減衰する可能性があるため、ここで行われているのは、文字配列が最後の行で使用されるときに最初にポインターに変換されることです。この後、整数にキャストされます (コンパイラはそれについて警告を発するはずです)。

解決するには、独自の文字列を整数ルーチンに実装するか、 を使用しますatoi

于 2013-01-27T18:57:05.060 に答える