c - 使用 fgets() 从文件中读取字符时出现设备错误的非法 ioctl

标签 c io

我正在尝试编写一个简单的 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/

相关文章:

使用 while 语句复制数组

c - 2D 到 3D 平行投影

java - 使用 BufferedReader 知道文件的偏移量吗?

java - 用于即时读取/拉取的自定义缓冲输入流

python - 写入过程完成后 HDF5 文件内容消失

ios - 二维数据高效存储,实现 "rotation"的行列数据

c - 限制结构体中的指针

c - 静态变量存储在哪里?

java - 读取 GAE 类路径上的配置文件

python - 将 pretty-print 的 JSON 从文件加载到 python 中?