c - C 中未读取整个文件(意外出现 EOF)

标签 c file-io

我正在尝试打印一个包含大约 4000 个字符的文件的内容。 该程序不知何故只记录了前 220 个字符并终止。

int main(void)
{
    char ch = ' ', file_name[25], payload[3904];
    FILE *fp;
    printf("Enter the name of file you wish to see\n");
    gets(file_name);
    fp = fopen(file_name, "r"); // read mode
    if (fp == NULL)
    {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }

    printf("The contents of %s file are :\n", file_name);

    int gin = 0;
    while ((ch = fgetc(fp)!=EOF))
    {
        printf("%d) %x \n",gin, ch);
        payload[gin++] = ch;
    }
    printf("Also, value of gin is %d --->", gin);
    getchar();

    //...rest of the code
}

此处gin的值为220。

为了检查,我修改了 while() 条件以针对文件中的确切字符数运行:

{
 //...

 while (gin<3904)
 {
    if ((ch = fgetc(fp)) == EOF) res++;//ADDED THIS TO COUNT NUMBER OF EOF's
    printf("%d) %x \n",gin, ch);
    payload[gin++] = ch;
    //printf(" %x \n", payload[(gin - 1)]);

    if (gin % 100 == 0)     
    {
        printf("Also, value of res is %d --->", res); getchar();
        getchar();
    }
 }

 //...rest of the code
}

gin的值达到了3904,res(no. of EOF's)的值是3684,也就是说前220之后的每个字符都被当作EOF读取。程序在第一个 220 个字符后开始读取 FF,即使它已被填充。

最佳答案

除了您应该将 ch 更改为 int 之外,我认为代码很好。

fgetc()返回

  • 如果成功,“将字符读取为转换为 int 的无符号字符”
  • 失败时,EOF 在文件末尾或错误”

因此,首先,您必须将 ch 更改为 int,因为 fgetc() 的一些返回值可能不是 适合 char

现在,在第二种情况下,您没有根据 EOF 检查 fgetc() 的返回值来检测任何错误。您只是获取返回值并尝试将这些值存储到数组中。实际上,当到达文件末尾时,没有更多内容可读取,所有对同一文件指针的进一步读取将返回错误。

很可能是那些值。 220 在你的情况下是 valid ,在所有。

因此,对于您问题中的陈述,

(EOF occurs unexpectedly)

错了。它发生得很好,你忽略了它并遇到了,好吧,麻烦


注意:

  1. 在您的第一个代码段中,您进行了两次连续的 fgetc() 调用,基本上丢弃了第一个的结果,并在没有任何检查的情况下使用了第二个。
  2. 永远不要使用gets()。它存在缓冲区溢出问题。始终使用 fgets()相反。

关于c - C 中未读取整个文件(意外出现 EOF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309897/

相关文章:

c - 如何更改C中的工作目录?

c - 通过 typedef 对数组私有(private)的结构内容的错位可能性

windows - 是否有用于在 Windows 中测试各种文件 I/O 的应用程序?

java - 使用 .setText 在 jTextArea 打印返回错误非静态变量无法从静态上下文引用

c - 如何使用 C 语言中的文件编写凯撒密码加密代码

c - 如何循环移动n个位置的数组

c - 如何获取 Solaris/Unix 上文件系统的 inode 计数?

C 内联源文件中的所有函数

android - Android 的文件夹路径选择器

file-io - ansible include_if_exists