我试图实现一个程序,我在我的Mac上在Windows系统上写的,我碰到了最后一个function的麻烦:
/* clearFiles */ // deletes the section files after the program has executed // skips any sections listed table that don't appear in the body (b/c no file was written for these) // also deletes the table & body files void clearFiles(section_t *tableArray, int *skipArray, char *tableName, char *bodyName) { int i, status, index; char str[SECTNAME]; char command[SECTNAME]; index = 0; // clear section files for(i=1; tableArray[i].count!=0;i++) { if(i!=skipArray[index]) { strcpy(str, tableArray[i].shortName); strcat(str,".txt"); status = remove(str); if(status!=0) printf("Warning! File %s not deleted.\n", str); } else index++; } // clear table file status = remove(tableName); if(status!=0) printf("Warning! File %s not deleted.\n", tableName); // clear body file status = remove(bodyName); if(status!=0) printf("Warning! File %s not deleted.\n", bodyName); }
该程序需要一个非常大的文件,并首先将其分割成一个目录文件和一个正文文件。 然后把它分成几百个单独的部分文件,从中执行程序的实际任务。 最后,我希望它删除所有这些额外的文件,因为他们只是凌乱的目录。 它在我的Unix Mac环境下完美工作,但是当我尝试在PC上的命令提示符下运行它时,我的remove()函数为每个部分文件返回-1并且不删除它(但是,它成功删除表格和正文文件)。 我也尝试过使用系统(del fileName)更强大的方法,但是这也不起作用,因为它说该文件正在被另一个进程使用。 我无法弄清楚为什么这些文件可能会打开,因为每次fopen()出现时,我都会使用fclose()进行跟踪。 检查文件是否打开时是例外情况,我使用
if(fopen(fileName,"r")!=NULL){}
这可能是问题吗? 有没有办法检查一个文件是否打开,而没有真正打开它,或者有办法closures这样检查的文件? 我试图分配一个虚拟指针,并编码:
dummy = fopen(fileName, "r"); if(dummy!=NULL){} fclose(dummy);
但是这也不起作用。 是否有可能只传递文件path到fclose()函数(例如,类似于fclose(C:\ users \ USER \ desktop \ fileName.txt)?另外,我知道该程序正试图删除正确的fileName,因为我的错误消息打印正确的名称到命令提示符。
任何input是非常感谢! 谢谢。
注意:tableArray从1开始,因为在程序中实现的searchfunction会返回索引,如果find则返回0,否则返回0。 事后看来,如果没有find,返回-1会更好,并开始索引为零,但这是一个单独的问题
更新:
以下是用于创build节文件的代码:
if(fopen(word, "r")==NULL){ ofile = fopen(word, "w"); fprintf(ofile, "SECTION %s ", section); //go until end of file or until found the next section // bug fix: check the section after that, too (in case the next section isn't there) while(fscanf(spec, "%s", word)!=EOF && !cease) { if(strcmp(word,"SECTION")!=0){ fprintf(ofile, "%s ", word); } else{ fscanf(spec, "%s", word); choice = testNumber(spec,word); for(j=i+1; tableArray[j].count!=0;j++) if(strcmp(word,tableArray[j].shortName)==0) cease = 1; } } fclose(ofile); }