Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 需要帮助找出fgets的问题所在吗_C_Null_Fgets_File Pointer - Fatal编程技术网

C 需要帮助找出fgets的问题所在吗

C 需要帮助找出fgets的问题所在吗,c,null,fgets,file-pointer,C,Null,Fgets,File Pointer,所以基本上我有一个指向一个文件的文件指针,这个文件有80个介于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 == NUL

所以基本上我有一个指向一个文件的文件指针,这个文件有80个介于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
    ,则该函数具有未定义的行为。对每个
    文件*
    进行单独测试,打印更明确的错误消息并退出程序
  • 您应该将数组的大小传递给
    fgets()
    81
    ,而不是
    80
  • 数组应分配给至少82个字节:80个字符加上尾随的换行符和空字节终止符
  • 您不测试内存分配失败。您甚至不应该分配内存,对于82字节这样的小尺寸,本地数组也可以
以下是更正的版本:

#包括
#包括
...
char-str[82];
文件*fpr=fopen(路径,“r”);
如果(fpr==NULL){
fprintf(stderr,“无法打开输入文件%s:%s\n”,路径,strerror(errno));
出口(1);
}
文件*fpw=fopen(“code.txt”,“w”);
如果(fpw==NULL){
fprintf(stderr,“无法打开输出文件%s:%s\n”、“code.txt”、strerror(errno));
出口(1);
}
if(fgets(str、str尺寸、fpr)){
int p1=0;
int p2=0;
...

始终测试错误条件并打印明确的错误消息,您将节省无数个小时的调试时间。

如果(fpr==NULL | | fpw==NULL){
您忽略此项,并尝试在可能的
fptr上使用
fgets
。您应该让
返回
退出
。检查“path”是否包含路径和文件名。它是否打印
“yikes”
?如果
yikes
未打印,也可能意味着您的文件为空,或者存在错误条件(检查
ferror()
以验证这一点)。您没有看到“yikes”,因为您没有换行符
\n