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的定义?),万一token 比 area 长,如果是这种情况你又遇到未定义的行为
也一样
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
我的程序在加载存在的文件时一直失败 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的定义?),万一token 比 area 长,如果是这种情况你又遇到未定义的行为
也一样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