0

テキストファイルにコピーしたくないIPのリストがあるとします。これが私がすることです..例えば、私はコピーしたくありません192.168.5.20...

私のtemp.txtファイルにはipがあります:

192.168.5.20
192.168.5.10
192.168.5.30
192.168.5.50
192.168.5.12

-

char *data = "192.168.5.20";

char buff[100];
FILE *in, *out;

in = fopen("/tmp/temp.txt", "r");

while(fgets(buff,sizeof(buff),in) !=NULL){


        if(!strstr(buff, data)){

        printf("copying to ip.txt\n");
        out = fopen("/tmp/ip.txt", "a");
        fprintf(out,"%s",buff);
        fclose(out);
        }


}
if(feof(in)){

printf("Closing file descriptor and renaming ip.txt to temp.txt\n");
fclose(in);
rename("/tmp/ip.txt", "/tmp/temp.txt");
}

IPを残して動作し192.168.5.20ますが、私の問題は、temp.txtにIPが1つしかない場合です。192.168.5.20

今は無視したいので、temp.txtファイルを開くと空白になっているはずです。192.168.5.20しかし、temp.txtファイルを開いたときにまだIPがありますか?..なぜそれをしているのですか?。

ありがとう..

4

3 に答える 3

0

このファイルは、無視するパターンを含まない/tmp/ip.txt行が少なくとも1行ある場合にのみ作成されます。/tmp/temp.txt

if(!strstr(buff, data)){
    printf("copying to ip.txt\n");
    out = fopen("/tmp/ip.txt", "a");
    fprintf(out,"%s",buff);
    fclose(out);
}

したがって、/tmp/temp.txt1行しか含まれておらず、無視するパターンが含まれている場合、no/tmp/ip.txtは作成されず、rename失敗し、に設定errnoされENOENTます。

でそれを確認してください

#include <errno.h>
#include <string.h>

int fail = rename("/home/dafis/Doesntexist", "/home/dafis/doesexist");
if (fail) {
    int en = errno;
    if (en)
        perror(strerror(en));
}
于 2012-10-31T14:51:52.360 に答える
0

192.168.5.20ファイルtemp.txtにのみ存在する場合は、whileループにさえ入っていません。これは、ip.txtを開いていない(存在しない場合は作成している)ことを意味します。したがって、名前の変更は失敗し、temp.txtは同じままです。次のようにコードを変更してみてください

   if (feof(in))
   {
      if(0 == out)
         out = fopen("ip.txt", "a");
      printf("\nrename returned %d",rename("ip.txt", "temp.txt"));

      printf("Closing file descriptor and renaming ip.txt to temp.txt\n");
      fclose(in);
   }

コードにいくつかのNULLチェックを追加してください。貴重な時間を節約します。

于 2012-10-31T14:52:46.777 に答える
0
char *unwanted = "192.168.5.20";

char buff[100];
FILE *in, *out;
unsigned cnt;

in = fopen("/tmp/temp.txt", "r");
out = fopen("/tmp/ip.txt", "w");

if (!in || !out) exit(EXIT_FAILURE);

for (cnt=0; fgets(buff,sizeof buff,in) ; ){
        if(strstr(buff, unwanted)) continue;
        fprintf(out,"%s",buff);
        cnt++;
        }

fclose(out);
fclose(in);

 /* note: this will maintain the original file if it **only** consists
 ** of lines with the (unwanted) pattern in it.
 ** IMHO you'd better do the rename unconditionally; an empty file
 ** would be the correct result if all the lines match.
 */
if(cnt){ 
    printf("Closing file descriptor and renaming ip.txt to temp.txt\n");
    rename("/tmp/ip.txt", "/tmp/temp.txt");
    }
于 2012-10-31T15:07:58.783 に答える