2

Mac で作成したプログラムを Windows システムに実装しようとしていますが、この最後の関数で多くの問題が発生しています。

/* 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 のようなもの)?私のエラーメッセージはコマンドプロンプトに正しい名前を出力するので、正しいファイル名。

どんな入力でも大歓迎です!!! ありがとう。

注: tableArray は、見つかった場合はインデックスを返し、見つからなかった場合は 0 を返すプログラムに実装された検索関数のため、1 から始まります。後から考えると、見つからなければ-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);
}
4

0 に答える 0