Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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没有忘记文件NULL_C_Loops_While Loop - Fatal编程技术网

循环-C没有忘记文件NULL

循环-C没有忘记文件NULL,c,loops,while-loop,C,Loops,While Loop,我正在检查目录中的文件。我做得很好。但当文件不存在时,我遇到异常-->的问题。我想做的是:检查文件,如果它存在,然后退出循环。如果文件不存在,则休眠。睡眠3秒钟后,再次检查文件。重复此操作直到找到文件,然后返回main()并打印“Hello everyone” 目前,如果该文件丢失,并且在程序运行时我将该文件放入该目录中,则在我停止该程序然后重新启动它之前,它不会识别新文件。我希望程序在睡眠后再次检查该文件 #include <fcntl.h> #include <stdio.

我正在检查目录中的文件。我做得很好。但当文件不存在时,我遇到异常-->的问题。我想做的是:检查文件,如果它存在,然后退出循环。如果文件不存在,则休眠。睡眠3秒钟后,再次检查文件。重复此操作直到找到文件,然后返回main()并打印“Hello everyone”

目前,如果该文件丢失,并且在程序运行时我将该文件放入该目录中,则在我停止该程序然后重新启动它之前,它不会识别新文件。我希望程序在睡眠后再次检查该文件

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <unistd.h>

#define MYFILE "/Users/stackoverflow/Documents/fileabc123"

int checkfile() {
    FILE *pFile;
    pFile = fopen(MYFILE,"r");
    char file_string[40];
    int repeat = 0;

    while( repeat < 1) {
        if (pFile!=NULL) {
            fgets (file_string,36,pFile);
            fclose (pFile);
            printf("%s\n", file_string);
            repeat = 1 ;
        }

        if (pFile ==NULL) {
            printf("Machine cannot read system file. \n");
            sleep(3);
        }
    }
}


int main (int argc, char ** argv) {
    checkfile();
    printf("Hello everyone\n");

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义MYFILE“/Users/stackoverflow/Documents/fileabc123”
int checkfile(){
文件*pFile;
pFile=fopen(MYFILE,“r”);
字符文件_字符串[40];
int repeat=0;
while(重复<1次){
if(pFile!=NULL){
fgets(文件字符串,36,pFile);
fclose(pFile);
printf(“%s\n”,文件\u字符串);
重复=1;
}
if(pFile==NULL){
printf(“计算机无法读取系统文件。\n”);
睡眠(3);
}
}
}
int main(int argc,字符**argv){
检查文件();
printf(“大家好”\n);
返回0;
}

您需要将
fopen
放入循环中

if ((pFile = fopen(MYFILE, "r")) != NULL) {
    // read it
}
else {
    printf("Failed opening");
}

错误在循环中

if ((pFile = fopen(MYFILE, "r")) != NULL) {
    // read it
}
else {
    printf("Failed opening");
}
您只是不想再次打开该文件:)

这将给您2个错误: 1.如果你把文件放进去,它就看不见了,因为程序不会试图打开它 2.如果文件存在,则读取它,然后关闭它,留下一个无效的文件描述符,但该描述符不是空的

这意味着下一个循环将尝试读取无效的文件描述符。这类似于从数组或free()指针读取/写入带有溢出索引的值。 你几乎总是有正确的价值。。直到ram被重新分配

因此: 1.您必须尝试打开文件,直到获得有效的文件描述符。 2.关闭不会更改指针值。想一想,它根本不能


如果你不想改变某个东西的值,你必须给出它的地址。指针是事物的地址。所以File*指向一个文件,但是如果你想更改File*指向的地址,你需要它的地址(&pFile),就像scanf:)

将“fopen”调用移动到循环体。我必须问一下,你读过代码了吗?fopen的
fopen
显然在循环之外,因此它只会发生一次,因此一旦失败,它将始终失败。这只是一个简单的调试,对未来的访问者来说几乎毫无用处。这个问题似乎离题了,因为它没有显示调试工作。