Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么read()函数返回错误?_C - Fatal编程技术网

C 为什么read()函数返回错误?

C 为什么read()函数返回错误?,c,C,我使用read()函数从文件中读取内容,但得到了-1返回值。文件不是空的,我想可能是数据类型的问题,但我不确定。 该文件的内容如下所示: 1e00 000a 0600 0003 0100 0004 0300 0005 0800 0006 0900 0007 0b00 0003 0C000 0009 提前谢谢 #define swapFname "test.disk" int main(int argc, char const *argv[]) { int diskfd; uns

我使用read()函数从文件中读取内容,但得到了-1返回值。文件不是空的,我想可能是数据类型的问题,但我不确定。 该文件的内容如下所示: 1e00 000a 0600 0003 0100 0004 0300 0005 0800 0006 0900 0007 0b00 0003 0C000 0009 提前谢谢

#define swapFname "test.disk"

int main(int argc, char const *argv[])
{
    int diskfd;
    unsigned *buf;
    diskfd = open (swapFname, O_RDWR | O_CREAT, 0600);
    int location = (2-2) * 16 * 8 + 0*8; // 0
    int ret = lseek (diskfd, location, SEEK_SET);
    int retsize = read (diskfd, (char *)buf, 32);
    if (retsize < 0)
    { printf ("Error: Disk read returned incorrect size: %d\n", retsize); 
        exit(-1);
    }
}
#定义swapFname“test.disk”
int main(int argc,char const*argv[]
{
int diskfd;
无符号*buf;
diskfd=open(swapFname,O|u RDWR | O|u CREAT,0600);
int位置=(2-2)*16*8+0*8;//0
int-ret=lseek(diskfd,位置,搜索集);
int retsize=read(diskfd,(char*)buf,32);
如果(retsize<0)
{printf(“错误:磁盘读取返回的大小不正确:%d\n”,retsize);
出口(-1);
}
}

首先,我建议检查您是否正确打开了文件,如果文件已打开,请检查
lseek
如果没有返回-1,然后如果您仍然想知道为什么读取时得到-1,请检查errno以查看最后的错误代码。

我能够在本地重现您的问题。这样做之后,我修改了程序,使其更能说明问题的性质:我没有打印一条手卷式但表达力最低的错误消息,而是使用
peror()
函数打印一条消息,解释错误的具体性质:

    if (retsize < 0) {
        perror("read");
        exit(-1);
    }

通过这一额外的修正,程序不再报告来自
read()
的错误。这意味着它可能在
open()
lseek()
中没有错误,但您应该单独测试每个结果。

检查
open
的返回值。检查
errno
集是什么。要打开的文件与程序执行的位置有关。是否存在?另一个问题是
buf
实际上并不指向缓冲区。请注意,如果
buf
设置正确,则不需要在调用中将其强制转换为
char*
read()
函数将
void*
作为第二个参数,任何对象指针都将自动转换为
void*
。名义上,您要求编译器进行两次强制转换。这些是很好的建议,但它们并不构成问题的答案。open和lseek都是正确的,问题在于指针buf。不管怎样,谢谢。谢谢你,约翰,它起作用了!确实,buf应该被分配到特定的长度。
    unsigned buf[16];