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/).还有
- 您应该在文件中写入一个换行符(以便它成为一个文本文件)
- 错误应该打印到标准错误流
- 打印打开文件失败的原因是个好主意
- 程序在失败时应退出并显示错误代码
- 仅当打开文件成功时才应调用 fclose
- 由于变量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)
如果 fp
是 NULL
,程序有 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;
}
#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/).还有
- 您应该在文件中写入一个换行符(以便它成为一个文本文件)
- 错误应该打印到标准错误流
- 打印打开文件失败的原因是个好主意
- 程序在失败时应退出并显示错误代码
- 仅当打开文件成功时才应调用 fclose
- 由于变量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)
如果fp
是NULL
,程序有 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;
}