C中的fseek()API和错误代码

时间:2015-08-18 11:27:24

标签: c fseek

我正在尝试运行以下代码并期待错误 [EBADF]流为NULL

#include <stdio.h>

int main ()    
{    
   FILE *fp;
   char ch;

   fp=fopen("test33.txt","r");

   fseek(fp,0L,SEEK_SET);

   while((ch=fgetc(fp))!=EOF)
     putchar(ch);
}

输出:

/home/akhils/file_dir#./a.out
Memory fault(coredump)

我可以通过哪个实用程序看到错误[EBADF]?我在HP-UX上运行此C程序并使用HP的C ++编译器。

我根据建议重写了以下代码:

#include<stdio.h>
#include<errno.h>
extern int errno;
int main ()
{ 
  FILE *fp;
  int val;

  char ch;

  fp=fopen("test33.txt","r");
  if(fp==NULL)
    printf("\n Error code for fopen is : %d\n",errno);
  else
  {
    val=fseek(fp,0L,SEEK_SET);
    if(val!=0)
      val=errno;
    else {
      while((ch=fgetc(fp))!=EOF)
      putchar(ch);
    }
    printf("\nError code for fseek is %d\n",val);
  }
}
Output : /home/akhils/file_dir#./a.out

 Error code for fopen is : 2

我的问题是抱歉,如果我在错误的意义上问我怎么知道错误是&#34; [EBADF] fildes参数不是有效的文件描述符。&#34;注意:当fopen返回NULL指针时,如果fopen()未成功完成,则fopen()的EABDF设置错误。

2 个答案:

答案 0 :(得分:3)

首先,您应检查fopen()是否成功,就好像失败一样,传递返回的指针(NULL)将在fseek()中调用undefined behaviour 。如果fopen()失败,则不应再使用返回的指针。

也就是说,要检测fseek()本身的错误,您应该检查fseek()的返回值是否成功(或错误)。如果fseek()失败,则会设置errno变量。您可以针对EBADF检查相同内容。

您不需要任何实用程序来检查错误代码。您可以在代码中使用#include <errno.h>,然后就可以访问errno变量值。

来自fseek()的{​​{3}},

  

[...] fgetpos()fseek()fsetpos()返回0,ftell()返回当前偏移量。 否则,返回-1并设置errno以指示错误。

关于EBADF,正如您所提到的,

  

EBADF
  指定的流不是可搜索的流。

答案 1 :(得分:0)

您至少应该检查文件是否可以实际打开:

   ...
   fp=fopen("test33.txt","r");
   if (fp == NULL)  
   {
     // abort if file cannot be opened
     printf("Cannot open file");
     return 1;
   }

   ...