我正在尝试运行以下代码并期待错误 [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设置错误。
答案 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;
}
...