" fastfwd"可以是pipe / socket / fifo的文件

时间:2014-06-02 15:52:47

标签: c++ c file-io fseek

我的函数得到一个FILE*来读取,它需要从一些非负偏移开始读取。 我可以使用fseek(file, offset, SEEK_SET),但它在stdin上失败,例如。

如何判断fseek是否有效?如果没有,我可以阅读并丢弃offset个字节。

有没有办法从FILE读取(和丢弃)而不分配读缓冲区?

2 个答案:

答案 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字节并且你保持读取的字节数,则读取直到你做了相当于一个搜索。如果它是一个可以存储内存的文件,那么你可以在不读取的情况下阅读,但搜索就可以了。