2013-05-01 103 views
0

据我所知,seekdir必须设置当前流的位置。但是,如果我设置了它,它会在下一个readdir之后为任何位置参数返回相同的d_name。我只是想为手动输入位置读取目录名,并且不希望在它无法设置流的位置与seekdir()

#include <iostream> 
#include <sys/types.h> 
#include <dirent.h> 
#include <string.h> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    if(argc > 1) 
    { 
     DIR* directory = opendir(argv[1]); 
     if (directory == NULL) 
     { 
      cout << "Enter valid directory name" << endl; 
      return -1; 
     } 

     long position = 0; 
     cout << "Enter position of directory stream: "; 
     cin >> position; 

     seekdir(directory, position); 

     dirent *dir = readdir(directory); 

     cout << dir->d_name <<":"<< strlen(dir->d_name) << endl; 
     closedir(directory); 

     return 0; 
    } 
    else 
    { 
     return -1; 
    } 
} 
+2

从手册页:*“loc参数应该是之前调用telldir(3)返回的值。”*看起来您并不像从telldir()获得参数。 – cdhowie 2013-05-01 20:47:21

+0

'telldir()'返回0.那么如何设置流的位置? – vmeln 2013-05-01 20:49:36

+1

通常你使用'seekdir()'返回到你之前的一个点,使用'telldir()'记录的值。 – cdhowie 2013-05-01 20:51:49

回答

2

使用循环与readdir从POSIX标准

的seekdir()函数将设置位置对由dirp指定的目录流执行的下一个readdir() 的操作到由loc指定的位置 。 loc的值应该早先从 返回给telldir()。在执行telldir()时,新位置将恢复为与目录流关联的一个 。

如果未从较早的呼叫获得 telldir(),或者如果一个呼叫到rewinddir()LOC值的调用之间发生 telldir()和调用seekdir(),结果后续调用 以readdir()未指定。

换句话说,您不能使用seekdir与您让用户输入的位置。只有从telldir返回的值。所以你只需要写这个循环。

+0

'telldir'返回当前流的位置。所以它仅适用于不同的流描述符? – vmeln 2013-05-01 20:51:31

+1

@VolodymyrMelnychuk当你想跳回到以前的位置时,这很有用。如果以前没有从'telldir()'中获得一个值,你就不能使用它来查找。 – cdhowie 2013-05-01 20:52:31

+1

如果您想保存已经到达的位置并使用seekdir返回,那么这很有用。你正在试图以不起作用的方式使用seekdir。 – john 2013-05-01 20:53:10