我试图在Windows系统上实现我在Mac上编写的程序,并且我在最后一个函数中遇到了很多麻烦:
/* 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并且不会删除它(但是,它确实成功了删除表格和正文文件)。我还使用system(del fileName)尝试了一种更强力的方法,但这也没有用,因为它说该文件正由另一个进程使用。我无法弄清楚为什么这些文件可能会打开,因为每次fopen()出现时,我都会用fclose()跟进它。例外情况是在检查文件是否打开时,我使用
if(fopen(fileName,"r")!=NULL){}
这可能是问题吗?有没有办法检查文件是否打开而没有实际打开它,或者有没有办法关闭以这种方式检查的文件?我尝试为它分配一个虚拟指针并编码:
dummy = fopen(fileName, "r");
if(dummy!=NULL){}
fclose(dummy);
但这也没有奏效。是否可以只将文件路径传递给fclose()函数(例如,类似于fclose(C:\ users \ USER \ desktop \ fileName.txt)?另外,我知道程序正在尝试删除更正fileName,因为我的错误消息会在命令提示符下输出正确的名称。
非常感谢任何输入!感谢。
注意: tableArray从1开始,因为在程序中实现了一个搜索函数,如果找到则返回索引,如果找不到则返回0。事后看来,如果找不到则返回-1会更好,并将索引设为零,但这是一个单独的问题
更新:
以下是用于创建部分文件的代码:
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);
}