0

再帰を使用してファイルを見つけようとしていますBFS。ディレクトリとファイルが指定されている場合、アルゴリズムは指定されたディレクトリまたはそのすべてのサブディレクトリをチェックする必要があります。

さて、ディレクトリをチェックする~と、文字列の最後にポップアップする迷惑なチルダが表示されることがありchar*ます。いくつか確認したところ、は実際にはファイル名の一部であるprintf-Sという結論に達しました。~

どうしてそうなるのでしょうか?私は何か間違ったことをしましたか?

これが再帰の一部です:

int scanner(char *dirname,char *entries , char * directory , char * file)
{

    struct stat st;


    /* scan the directory and store the entries in a buffer */
   DIR *dir;
   struct dirent *ent;
   int count=1;
   char name[256];

   if ((dir = opendir(dirname)) == NULL)
   {
     perror("Unable to open directory");
     return(0);
   }

   while ((ent = readdir(dir)) != NULL)
       count++;

   rewinddir(dir);

   // here we copy all the file-names from the directory into the buffer
   // we copy all the names using sprintf and strcpy


   while ((ent = readdir(dir)) != NULL)
   {

       strcpy(name,ent->d_name);


       if (strcmp(name , file) == 0 )

       {
           printf("\nFile was found  !!! in first IF\n");
           printf("\n-----------------------------------------------------------------------\n");

           if (stat(name, &st) < 0) {
                perror(name);
                putchar('\n');
                continue;
            }

           printfile(&st , name);
           printf("\nStringer 'name' is : %s" , name);
           printf("\nThe length of %s is %d" , name , strlen(name));
       }

       else // try
       {
           int length = strlen(name);
           char try[length+2];
           strcpy(try,name);
           try[length+1] = '~';
           try[length+2] = '\0';


           printf("\nThe 'name' is : %s" , name);
           printf("\nThe length of %s is %d" , name , strlen(name));
           printf("\nPrint try %s\n" , try);
           if (strcmp(try , file) == 0 )
               printf("\nFile was found  !!! in second IF\n");
       }


       sprintf(entries,"%s",name);
       entries = entries+strlen(name)+1;

       printf("\nStringer name :%s" , name);

       count++;
   }

   if (closedir(dir) != 0)
     perror("Unable to close directory");

     return(count);
}

そして、terminal私がヒット./exer4 check david.txtし、得たから:

The 'name' is : ..
The length of .. is 2
Print try ..

Stringer name :..
The 'name' is : .
The length of . is 1
Print try .

Stringer name :.
The 'name' is : insideCheck
The length of insideCheck is 11
Print try insideCheck

Stringer name :insideCheck
The 'name' is : david.txt~
The length of david.txt~ is 10
Print try david.txt~

Stringer name :david.txt~
The 'name' is : doc.txt~
The length of doc.txt~ is 8
Print try doc.txt~
4

2 に答える 2

4

サフィックスとしてチルダ (~)がある場合、ファイルが自動バックアップであることを意味します。たとえば、Emacs はこれらの. あなたの例はチルダ接尾辞付きのテキスト(.txt)ファイルを示しているので、Emacsがここで犯人である可能性が非常に高いようです.

したがって、コードに問題はありません。これらのファイルは実際に存在するため、どのツールでもこれらのファイルが表示されるはずです。

于 2012-06-15T09:01:17.550 に答える
1

viまたはVimをエディタとして使用していますか? これらのファイル (名前の末尾が~) は、 によって作成される一時ファイルですvi

于 2012-06-15T09:01:27.543 に答える