fopen 没有那个文件或目录

fopen No such file or directory

我的程序在加载存在的文件时一直失败 returns: 没有那个文件或目录 没有其他问题有任何帮助,因为其他人有不同的问题

incident *fileIn(incident* head){
    incident *new;  
    new = (incident *) malloc(sizeof(incident));
    if (new == NULL) {
        printf("No memory has been allocated the program will exit\n");
        exit(1);
    }
    FILE *fPointer;
    fPointer = fopen("input.txt","r");

    if (fPointer == NULL)
    {
        printf("Could not open file\n");
        perror("Err");
        exit(1);
    }

    new->next = new;
    char curr_line[300];

    while(fgets(curr_line, 10000, fPointer) != NULL){
new = (incident *) malloc(sizeof(incident));
        char *token=strtok(curr_line,";/");     /*auth xorizei thn eisodo kathe fora pou petixenei ; h / (gia tis imerominies)*/
        strcpy(new->coordinates.area,token);

        token=strtok(NULL, ";/");   
        new->reported.day=atoi(token);      /*h atoi metatrepei to string se int*/


        token=strtok(NULL, ";/");
        new->reported.month=atoi(token);

        token=strtok(NULL, ";/");
        new->reported.year=atoi(token);
token=strtok(NULL, ";");
        strcpy(new->url,token);

        incident* tail = head;
        if (head->next == head){
            head->next = new;
            new->next = head;

        }



        tail = tail->next;


        tail->next = new;
        new->next = head;
    }
    fclose(fPointer);
}

文件在那里,我也添加了整个路径,但无济于事。任何帮助将不胜感激。我能做些什么它会在几个小时后到期,我已经尝试了所有我能想到的方法

修改后还有几个问题。

   new->next = new;

你创建了一个只有一个单元格的圈子列表,你不想要那个,因为就在你这样做之后:

while(fgets(curr_line, 10000, fPointer) != NULL){
   new = (incident *) malloc(sizeof(incident));

你有内存泄漏。你需要在需要的时候分配,你做得太早了,行

incident *new;  
new = (incident *) malloc(sizeof(incident));
if (new == NULL) {
    printf("No memory has been allocated the program will exit\n");
    exit(1);
}

必须移到 while 中并且 new->next = new; 行必须删除

正在做:

char curr_line[300];

while(fgets(curr_line, 10000, fPointer) != NULL){

你允许fgets在数组中写入最多10000个字符,允许只包含300个,行为未定义,大小必须相同,例如:

char curr_line[300];

while(fgets(curr_line, sizeof(curr_line), fPointer) != NULL){

如果输入文件的内容有误,strtok 永远不会通过 return 检查值 return,strtok 将 return NULL 并且您将有未定义的行为。

做的时候:

strcpy(new->coordinates.area,token);

假设area是一个数组(chat是incident的定义?),万一tokenarea 长,如果是这种情况你又遇到未定义的行为

也一样
strcpy(new->url,token);

您还使用了 2 次 atoi,但如果 token 不是有效数字 atoi 静默 returns 0,我建议你使用 strtol 来检测错误,或者至少使用 if (sscanf(token, "%d", &new->reported.month) != 1) ...error...

你所有的列表管理都错在

   incident* tail = head;
   if (head->next == head){
       head->next = new;
       new->next = head;

   }

   tail = tail->next;

   tail->next = new;
   new->next = head;

因为 head->next == head 肯定总是假的(你没有 cicle 列表),而且你不想创建一个 circle 列表做 tail = tail->next; 等等

你只想在列表的末尾添加,很可能 head 可以是 NULL。

另请注意,您的函数必须 return 一个 incident * 很可能是新的负责人,但您永远不会 return.

你想要这样的东西:

new->next = NULL;

if (head == NULL)
  head = new;
else {
   incident* tail = head;

   while (tail->next != NULL)
     tail = tail->next;
   tail->next = new;
}

但是每次搜索列表的末尾都是白费力气,最好搜索 [=19= 之前的最后一个单元格(如果 head 不是 NULL) ] 然后在循环中更新 tail

也不要忘记在函数末尾执行 return head;

我不能给出完整的代码,因为你没有给出事件的定义,你也没有谈论输入文件的内容=>这就是为什么第一条评论是关于 Minimal, Complete, and Verifiable example