2013-05-01 98 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