我的函数得到一个FILE*
来读取,它需要从一些非负偏移开始读取。
我可以使用fseek(file, offset, SEEK_SET)
,但它在stdin
上失败,例如。
如何判断fseek
是否有效?如果没有,我可以阅读并丢弃offset
个字节。
有没有办法从FILE
读取(和丢弃)而不分配读缓冲区?
答案 0 :(得分:1)
fseek()
的返回值告诉您它是否有效:
返回值
...成功完成后,fgetpos(),fseek(),fsetpos()返回0,...否则,返回 -1并设置errno以指示错误。
因此,尝试从文件中fseek()
并检查返回结果,并相应地处理您的失败案例。例如:
ret = fseek(stdin, 0, SEEK_SET);
if(ret < 0)
printf("failed because: %s\n", strerror(errno));
会给你一些类似的东西:
failed because: Illegal seek
所以失败是因为你无法寻找stdin
,其中:
FILE * fp = fopen("word.txt", "r");
ret = fseek(fp, 0, SEEK_SET);
if(ret < 0)
printf("failed because: %s\n", strerror(errno));
不会打印任何东西,因为你回来0
表示成功(当然假设"word.txt"
存在,可读,成功打开等)。
我不明白你问题的这一部分:
有没有一种方法可以在不分配读缓冲区的情况下从FILE读取(和丢弃)
您只需要fseek()
到您想要读取的点,或者您可以将数组读入缓冲区然后覆盖结果。答案取决于您的目标,但使用fread()
或read()
之类的内容将需要一个非空指针来存储数据。
答案 1 :(得分:1)
您可以通过调用fseek( file, offset, SEEK_SET)
来测试fseek是否适用于该流,并在出错时检查返回的errno == EBADF
是否说“指定的流不是可搜索的流”。
我认为你需要使用缓冲区来读取和丢弃,但如果它只能是pagesize字节并且你保持读取的字节数,则读取直到你做了相当于一个搜索。如果它是一个可以存储内存的文件,那么你可以在不读取的情况下阅读,但搜索就可以了。