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

时间:2011-07-12 22:41:54

标签: c low-level

我正在进行C编程分配,我们只允许使用较低级别的文件IO命令(因此没有fprintf()fscanf()函数调用)来读取和写入文件。

在代码的一部分中,我将一个字符串写入一个128个字符的文件中,然后在它旁边写一个整数。我可以使用preadread字符串,但是当我再次使用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"); 
}

有人知道我做错了吗?

3 个答案:

答案 0 :(得分:1)

structure->sizeint*吗?如果它只是int,那么您需要使用&传递其地址。

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

答案 1 :(得分:1)

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

什么是structure->size?什么类型?

编辑

因为你实际上在写一个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"); 
}

答案 2 :(得分:1)

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

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

第一个pread()有效,因为(我怀疑)structure->str是一个char*或一个字符数组,它们将被视为一个指针。

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");
}