我正在进行C编程分配,我们只允许使用较低级别的文件IO命令(因此没有fprintf()
或fscanf()
函数调用)来读取和写入文件。
在代码的一部分中,我将一个字符串写入一个128个字符的文件中,然后在它旁边写一个整数。我可以使用pread
来read
字符串,但是当我再次使用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");
}
有人知道我做错了吗?
答案 0 :(得分:1)
structure->size
是int*
吗?如果它只是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");
}