因此,基本上我有一个文件清点,该文件的文件在0到1之间,我需要将它们放入字符串中,然后对其进行操作。
该函数返回NULL
,我找不到问题,因为如果它返回NULL
,则表示错误。
FILE *fpr = fopen(path, "r");
FILE *fpw = fopen("code.txt", "w");
char *str = calloc(81, sizeof(char));
if (fpr == NULL || fpw == NULL) {
printf("yikes");
}
if (fgets(str, 80, fpr) != NULL) { //HERE ITS NULL
int p1 = 0;
int p2 = 0;
我真的考虑过,我真的很愚蠢,要么没有明显的问题。
在代码片段中是一些问题:
- 如果任何文件都无法打开,您仍然会调用
fgets()
,如果fpr
为NULL
,则具有未定义的行为。为每个FILE*
进行单独的测试,打印一个更明确的错误消息并退出程序。 - 您应该将数组的大小传递给
fgets()
,81
而不是80
。 - 该数组应至少分配给82个字节:80个字符以及尾随的newline和一个空字节终结器。
- 您不测试内存分配失败。您甚至不应该分配内存,对于82个字节(例如82个字节(,本地阵列也可以。
这是一个更正的版本:
#include <errno.h>
#include <stdio.h>
...
char str[82];
FILE *fpr = fopen(path, "r");
if (fpr == NULL) {
fprintf(stderr, "cannot open input file %s: %sn", path, strerror(errno));
exit(1);
}
FILE *fpw = fopen("code.txt", "w");
if (fpw == NULL) {
fprintf(stderr, "cannot open output file %s: %sn", "code.txt", strerror(errno));
exit(1);
}
if (fgets(str, sizeof str, fpr)) {
int p1 = 0;
int p2 = 0;
...
始终测试错误条件并打印明确的错误消息,您将确保无数小时的调试时间。