我正在尝试编写一个简单的 C 程序来一次从文件中读取一定数量的字符,然后将其存储在一个变量中。例如,一次 10 个字符。
我正在尝试使用 fgets() 来执行此操作,但它一直返回错误 失败:设备的非法 ioctl,我无法排除故障并且在搜索有关它的一些信息后找不到。
我多次尝试重写我的代码,并通读了文档,但我仍然找不到问题的根源。
这是我的代码:
Main 函数(我已经完成参数检查但为简单起见省略了它们)
int main(int argc,char *argv[]) {
FILE *file;
file=check_file(argv[1]);
readCharacters(file);
return 0;
}
检查文件函数
FILE * check_file(char *fileName)
{
FILE *file = fopen(fileName, "rb");
if(!file) {
perror("SENDER: File does not exists");
fclose(file);
exit(1);
}
return file;
}
读取字符函数
void readCharacters(FILE* fp) {
char buff[TOTALCHAR], *result;
if ((result = fgets(buffer,TOTALCHAR,fp)) != NULL)
printf("The string is %s\n", result);
else if (ferror(fp)) {
perror("FAILED");
} else {
printf("EOF was reached");
}
如果我的文本文件是:
“敏捷的棕色狐狸跳过懒惰的狗”
预期结果:
第一个字符串 = "The quick brown" 第二个字符串=“狐狸跳过” 等等
实际结果:
达到EOF
编辑:我在回答原始问题后更新了我的代码,事实证明已经达到了 EOF。但是,我正在读取的文件绝对不是空的
最佳答案
这个电话
result = fgets(buff,TOTALCHAR,fp))
将在错误时返回 NULL
,但如果达到 EOF,也会。这不一定是错误情况。您必须手动区分,例如使用 ferror()
函数:
if ((result = fgets(buff,TOTALCHAR,fp)) != NULL)
printf("The string is %s\n", result);
else if (ferror(fp)) {
perror("FAILED");
} else {
printf("EOF was reached");
}
您假设 EOF 是一个错误,perror()
将只输出最后一件事,errno
被设置为。在这种情况下,它可能是对 ioctl()
的一些内部 libc 调用。
如果这个分支
printf("The string is %s\n", result);
永远不会被占用,那么你打开的文件必须是空的(即它在第一次读取尝试时返回 EOF)
关于c - 使用 fgets() 从文件中读取字符时出现设备错误的非法 ioctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55666299/