C 使用read()从文件中读取int

C 使用read()从文件中读取int,c,low-level,C,Low Level,我正在做一个C编程任务,我们只允许使用较低级别的文件IO命令(因此没有fprintf()或fscanf()函数调用)来读写文件 在代码的一部分中,我将一个字符串写入一个128个字符的文件,并在其旁边写入一个整数。我可以使用pread来读取字符串,但当我再次使用pread读取整数时,会出现“坏地址”错误: if(pread(heap, structure->str, STRING_MAX_LEN, 0) < 0) { return -1; } else { printf

我正在做一个C编程任务,我们只允许使用较低级别的文件IO命令(因此没有
fprintf()
fscanf()
函数调用)来读写文件

在代码的一部分中,我将一个字符串写入一个128个字符的文件,并在其旁边写入一个整数。我可以使用
pread
读取
字符串,但当我再次使用
pread
读取整数时,会出现“坏地址”错误:

if(pread(heap, structure->str, STRING_MAX_LEN, 0) < 0)
{
    return -1;
}
else
{
    printf("read str\n");
}

if(pread(file, structure->size, 1, STRING_MAX_LEN + 1) < 0)
{
    return 0;
}
else
{
    printf("read size\n"); 
}
if(前置(堆,结构->字符串,最大长度,0)<0)
{
返回-1;
}
其他的
{
printf(“读取str\n”);
}
如果(前置(文件,结构->大小,1,字符串\u MAX\u LEN+1)<0)
{
返回0;
}
其他的
{
printf(“读取大小\n”);
}

有人知道我做错了什么吗?

structure->size
an
int*
?如果它只是一个
int
,那么您需要用
&
传递它的地址


Edit:正如其他人所说,“1”几乎肯定不是int中的字节数,尽管它可能是-您可能应该使用
sizeof()

is
structure->size
an
int*
?如果它只是一个
int
,那么您需要用
&
传递它的地址


Edit:正如其他人所说,“1”几乎肯定不是int中的字节数,尽管它可能是-您可能应该使用
sizeof()

传递1作为整数的大小。除非是字符,否则你是做错了

什么是结构尺寸?什么类型

编辑

因为您实际上是在编写一个int,所以应该使用
sizeof(int)
sizeof(structure->size)

您还应该使用
&
运算符将地址传递给变量,而不是它的值,因此您的行如下所示:

if (pread(file, &structure->size, sizeof(structure->size), STRING_MAX_LEN + 1) < 0) { 
    return 0; 
} 
else { 
    printf("read size\n"); 
}
if(pread(file,&structure->size,sizeof(structure->size),STRING\u MAX\u LEN+1)<0){
返回0;
} 
否则{
printf(“读取大小\n”);
}

您正在传递一个1作为整数的大小。除非是字符,否则你是做错了

什么是结构尺寸?什么类型

编辑

因为您实际上是在编写一个int,所以应该使用
sizeof(int)
sizeof(structure->size)

您还应该使用
&
运算符将地址传递给变量,而不是它的值,因此您的行如下所示:

if (pread(file, &structure->size, sizeof(structure->size), STRING_MAX_LEN + 1) < 0) { 
    return 0; 
} 
else { 
    printf("read size\n"); 
}
if(pread(file,&structure->size,sizeof(structure->size),STRING\u MAX\u LEN+1)<0){
返回0;
} 
否则{
printf(“读取大小\n”);
}

尝试使用
sizeof
而不是硬编码大小。让编译器为您工作

第二,的第二个参数看起来是指向要填充的缓冲区的指针。通过值传递int字段本身——通常,C编译器非常乐意将int作为指针。您需要通过引用传递int字段,以便
pread
有一个指向它应该用八位字节填充的int的指针。您将获得内存访问冲突(坏地址),因为您通过值传递的int字段的值被视为指向内存位置的地址点,因此不允许触摸

第一个
pread()

if ( pread(heap,structure->str,STRING_MAX_LEN,0) < 0 )
{
  return -1;
}
else
{
  printf("read str\n");
}

if ( pread(file,&(structure->size), sizeof(structure->size) , STRING_MAX_LEN + 1 ) < 0 )
{
  return 0 ;
}
else
{
  printf("read size\n");
}
if(前置(堆,结构->字符串,最大长度,0)<0)
{
返回-1;
}
其他的
{
printf(“读取str\n”);
}
if(pread(文件,&(结构->大小)、sizeof(结构->大小)、STRING\u MAX\u LEN+1)<0)
{
返回0;
}
其他的
{
printf(“读取大小\n”);
}

尝试使用
sizeof
而不是硬编码大小。让编译器为您工作

第二,的第二个参数看起来是指向要填充的缓冲区的指针。通过值传递int字段本身——通常,C编译器非常乐意将int作为指针。您需要通过引用传递int字段,以便
pread
有一个指向它应该用八位字节填充的int的指针。您将获得内存访问冲突(坏地址),因为您通过值传递的int字段的值被视为指向内存位置的地址点,因此不允许触摸

第一个
pread()

if ( pread(heap,structure->str,STRING_MAX_LEN,0) < 0 )
{
  return -1;
}
else
{
  printf("read str\n");
}

if ( pread(file,&(structure->size), sizeof(structure->size) , STRING_MAX_LEN + 1 ) < 0 )
{
  return 0 ;
}
else
{
  printf("read size\n");
}
if(前置(堆,结构->字符串,最大长度,0)<0)
{
返回-1;
}
其他的
{
printf(“读取str\n”);
}
if(pread(文件,&(结构->大小)、sizeof(结构->大小)、STRING\u MAX\u LEN+1)<0)
{
返回0;
}
其他的
{
printf(“读取大小\n”);
}

结构类型->大小为整数。我以前尝试过将其大小设置为sizeof(int),但也没有成功。structure->size的类型是整数。我以前尝试过将其大小设置为sizeof(int),但也没有成功。