0
FILE *mails;
FILE *tempmails;
mails = fopen("mailer.txt", "r");
tempmails = fopen ("tempmailer.txt" , "a+");
char line[200],templine[200];
char blnklne[]="\n";        
while(fgets(line, sizeof line, mails) != NULL)
{       
    int flag=0;    
    while(fgets(templine, sizeof line, tempmails) != NULL)
    {               
        if((strcmp(line,templine)==0) || (strcmp(line,blnklne)==0))
        {               
            flag = 1;               
        }               
    }           
    if(flag == 0)
    {           
        fputs(line, tempmails);             
    }       
}       
fclose(mails);
fclose(tempmails);
tempmails = fopen ("tempmailer.txt", "r");
remove("mailer.txt");
FILE *newmails;
newmails = fopen("mailer.txt", "a");
while(fgets(templine, sizeof line, tempmails) != NULL)
{       
    fputs(templine, newmails);      
}       
fclose(newmails);
fclose(tempmails);
remove("tempmailer.txt");

上記の C コードは、次の目的で作成しました。

  1. から各行を読み取ってmailer.txt、行が空白か繰り返されているかを確認する必要があり、両方の条件が偽の場合は一時ファイルに入力する必要がありますtempmailer.txt
  2. ファイルを削除してmailer.txtから、新しいファイルを作成し、新しいファイルに 1 つずつコピーして入力し、削除しtempmailer.txtます。

しかし、実際に実行すると次のようになります。

  1. 指定された条件に関係なく、すべての行からコピーします(望ましくmailer.txtない)tempmailer.txt
  2. 削除mailer.txtして新しいmailer.txt(望ましい)を作成します
  3. から新しいファイルにそのままコピーしtempmailer.txtます(望ましい)
  4. 削除しtempmailer.txtます (望ましい)

私が何をしても、この問題を根絶することはできません。OSはリナックスです。私を助けてください。前もって感謝します。

4

5 に答える 5

2

2 番目の while ループの前に、ファイルの先頭をシークする必要があります。

現状では、2 番目の while ループは、常にファイルの末尾を指しているため、一致する行を見つけることはありません。

于 2012-06-15T13:44:17.970 に答える
2

tempmails各 2 番目のループを開始する前に、ファイルの先頭にリセットします。

while(fgets(line, sizeof line, mails) != NULL)
{
    int flag=0;
    rewind(tempmails);                              /* go back to the begining */
    while(fgets(templine, sizeof line, tempmails) != NULL)
    {
        /* ... */
    }
}
于 2012-06-15T13:55:29.933 に答える
1

たぶん、コードのこの部分があなたがあなたの質問を得た理由です1

while(fgets(line, sizeof line, mails) != NULL)
{       
     int flag=0;    
     while(fgets(templine, sizeof line, tempmails) != NULL)
    {               
        if((strcmp(line,templine)==0) || (strcmp(line,blnklne)==0))
       {               
            flag = 1;               /* this part may be not correct */
        }               
    }           
    if(flag == 0)
    {           
        fputs(line, tempmails);             
    }       
}         

プログラムがif条件をtrueにする行を見つけた場合、フラグは1に設定されますが、次の行はif条件trueを作成しない可能性があり、プログラムはフラグを0に設定できません。 tempmailへの一致した行の後にあります。

于 2012-06-15T13:54:04.720 に答える
1

繰り返し検出コードは非常に奇妙で、両方のファイルから同時に読み取っています。追加用に開いたファイルから読み取ることはできません。トライモードa+

これは簡単なシェルスクリプトで解決できますが、本当に C で書かなければならないのでしょうか?

于 2012-06-15T13:37:23.173 に答える
0

免責事項: これは実際には答えではありませんが、デバッグに役立つことは間違いありません!

次の行の後、ポインターが NULL かどうかを確認する必要があります。

mails = fopen("mailer.txt", "r");
tempmails = fopen ("tempmailer.txt" , "a+");

if (mails == NULL) printf("Error: could not open file");
if (tempmails == NULL) printf("Error: could not open file");

これで、少なくともファイルを開いて読み取ることができるかどうかを知ることができます。が機能しているかどうかfgets、エラーが発生していないかどうかを確認するには、ferrorまたはを使用しますfeof

fopenFILE ハンドルを呼び出すたびに、同じ NULL チェックを追加する必要があります。

于 2012-06-15T13:38:33.563 に答える