在C中使用read()系统调用ints

时间:2013-01-27 18:54:48

标签: c

我必须使用文件中的单个读取来构建包含字符,整数和浮点数的结构。我能够很好地阅读这些字符,但我在阅读这些内容时遇到了问题

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 个答案:

答案 0 :(得分:1)

我相信@slugonamission关于指针问题是正确的,但是如果我正确理解了问题,那么int作为int存储在文件中,并且你处理char数组的原因是你被迫从你正在做的事read

为此尝试memcpy。还要注意端序问题。

int A;
memcpy(&A, Buff + 33, 4 * sizeof(char))

答案 1 :(得分:1)

问题是INTEGER是一个数组,相当于C中的指针。因此,当你将它转换为int时,你正在转换指针,而不是值,给你疯狂的结果。解决方案?转换为int指针,然后取消引用:

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

作为一种快捷方式,您可以使用一些指针算法来避免循环:

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

如果您需要一个副本,那就不会复制(如果您打算更改int并希望保持缓冲区不变)。

答案 2 :(得分: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]和{{1} },并分别使用atoi和atof将其转换为int或float。

答案 3 :(得分:-1)

char INTEGER[4];
for(i=0;i<4;i++) //Read an int
{
    INTEGER[i]=Buff[33+i];
}
int A =(int)INTEGER;

问题与保存您的值的数组有关。数组可以在C中自动衰减到指针,所以这里发生的是你的字符数组在最后一行上使用时首先被转换为指针。在此之后,它将被强制转换为整数(并且您的编译器应该向您发出警告)。

要解决,要么将自己的字符串实现为整数例程,要么使用atoi