【问题标题】:Illegal ioctl for device error when using fgets() to read characters from a file使用 fgets() 从文件中读取字符时出现设备错误的非法 ioctl
【发布时间】:2019-09-04 02:02:13
【问题描述】:

我正在尝试编写一个简单的 C 程序来一次从文件中读取一定数量的字符,然后将其存储在一个变量中。例如,一次 10 个字符。

我正在尝试使用 fgets() 执行此操作,但它一直返回错误 失败:设备的非法 ioctl,我无法排除故障,在搜索有关它的一些信息后也找不到。

我多次尝试重写我的代码,并阅读了文档,但我仍然找不到问题的根源。

这是我的代码:

主函数(我已经完成了参数检查,但为简单起见省略了它们)

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");
    }

如果我的文本文件是:

“敏捷的棕狐跳过懒狗”

预期结果:

First String = "快速棕色" Second String = "狐狸跳过" 等等

实际结果:

到达EOF

编辑:我在回答原始问题后更新了我的代码,结果发现已经达到 EOF。但是,我正在读取的文件绝对不是空的

【问题讨论】:

    标签: c io


    【解决方案1】:

    这个电话

    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)

    【讨论】:

    • 谢谢,原来到达EOF了。我不知道为什么会这样,因为我的文件超过 200 个字符,而且绝对不是空的。我需要在 readCharacter() 中再次打开文件还是已经在 check_file 中处理过?
    • @CizzleP 不,您不需要重新打开文件;它是一个简单的文本文件吗?该错误似乎很微妙,以节省一些时间:在您的问题中发布 full 代码,发布您拥有的确切文本文件并显示您如何启动程序。如果还有其他值得注意的情况,请告诉我们。
    • 这只是一个简单的文本文件,就像我的例子一样。是通过命令行传入的
    • @CizzleP 正如我所说,您提供的信息无法解释这种行为。按照我的要求提供更多详细信息,否则没有人可以帮助您
    • 我使用 cc filename.c -o 工作正常的输出文件以标准方式编译我的代码。然后我像这样运行我的代码 ./output input.txt ,其中输入是文本文件。它在同一目录中
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多