if(fp != EOF) -> 警告:指针和整数之间的比较

if(fp != EOF) -> Warning: Comparison between pointer and integer

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;

   char written[]= "This is not as easy as I thought it would be.";
    fp = fopen("Aufgabe 3.txt", "w");
    if(fp != EOF)
    {
        fprintf(fp, "%s", written);
        printf("Text was written!\n");
    }
    else
    {
        printf("File can not be found!");
    }
    fclose(fp);

    return 0;
}

嗨,我是编码新手,需要一点帮助。 :D

有谁知道怎么去掉这个警告,我只想把一句话写成.txt。

在线警告:10 if(fp != EOF)

comparison between pointer and integer

fopen function returns 指向新打开的文件流的指针,或者出错时 NULL 指针( 不是EOF 整数 常量相同)。改用这个:

    if(fp != NULL)
    {
        fprintf(fp, "%s", written);
        printf("Text was written!\n");
    }
    else
    {
        printf("File can not be found!");
    }

变量 fp 是一个指针,所以你应该将它与 NULL 进行比较,而不是 EOF,它是一个整数(参见 fopen[=27 的参考文档=]: https://pubs.opengroup.org/onlinepubs/9699919799/).还有

  1. 您应该在文件中写入一个换行符(以便它成为一个文本文件)
  2. 错误应该打印到标准错误流
  3. 打印打开文件失败的原因是个好主意
  4. 程序在失败时应退出并显示错误代码
  5. 仅当打开文件成功时才应调用 fclose
  6. 由于变量written没有被修改所以可以变成指针常量

这是更正后的版本:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    const char *filename = "Aufgabe 3.txt";
    const char *written = "This is not as easy as I thought it would be.";
    FILE *fp;

    fp = fopen(filename, "w");
    if (fp != NULL) {
        fprintf(fp, "%s\n", written);
        printf("Text was written!\n");
        fclose(fp);
    } else {
        fprintf(stderr, "Opening file '%s' failed: %s:\n", filename, strerror(errno));
        exit(EXIT_FAILURE);
    }
    return 0;
}

EOF 是负整数常量的宏。 fp 是指向 FILE.

的指针

如果你使用

if (fp != EOF)

您将指针与非零值的整数进行比较,这是不允许的。

EOF替换为NULL,这是一个用指针检查错误的宏:

if (fp != NULL)

旁注:

  • 此外,您应该只在指向已成功打开的流的指针上使用 fclose()。如果你使用 flose(fp) 如果 fpNULL,程序有 undefined behavior.

  • 此外,使用 if (fp != NULL) 检查流的打开是否 没有 错误,然后继续进入 if 的正文当文件流打开成功时。否则,如果打开不成功,您将进入 else 正文。

    这段代码可以简化。

    只需检查是否发生错误,如果是,则通过 if 主体中的错误例程。如果不是,控制流立即继续到 if 语句之后的 main() 中的代码。不需要 else.

  • 您的错误例程应该在生产代码中得到增强。仅仅打印出文件打开不成功是不够的。


#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    FILE *fp;

    char written[] = "This is not as easy as I thought it would be.";

    fp = fopen("Aufgabe 3.txt", "w");
    if (fp == NULL)
    {
        perror("fopen: ");
        exit(EXIT_FAILURE);
    }

    fprintf(fp, "%s", written);
    printf("Text was written!\n");

    fclose(fp);

    return 0;
}