2012-01-18 60 views
0

本質上,我想要做的是檢查文件的最後訪問時間,並將其與字符串進行比較。這裏是相關的塊:本地時間替代,將不會覆蓋提供的結構

struct stat file; 
char timeStr[ 100 ]; 

stat(nodes.at(0), &file); 
strftime(timeStr, 100, "%H:%M:%S-%m/%d/%y", localtime(&file.st_atime)); /* problem */ 

nodes是文件路徑的向量;我不知道這是否是相關的,但我會包括我使用的設置nodes代碼:

vector<char*> nodes; 
DIR *dir; 
struct dirent *cur 

if((dir = opendir(searchPath.c_str())) == NULL) { 
    cout << "Error opening search path. Are you sure '" 
     << searchPath.c_str() << "' is a valid search path?" << endl; 
    return 0; 
} 
while((cur = readdir(dir)) != NULL) { 
    if(string(cur->d_name) == "." || string(cur->d_name) == "..") continue; 
    nodes.push_back(cur->d_name); 
} 
closedir(dir); 

searchPath是用戶輸入的字符串。

問題:當'問題'行運行時,從那裏開始nodes是垃圾的向量。我想知道如果我能在不將nodes變成垃圾的情況下完成這項任務。

由於這是作業,而且您可能會發現我不習慣C++,所以向正確方向的堅實推動將被賦予'接受'。

謝謝。

+0

什麼是相關的代碼調用'localtime()'的東西。像你在做的那樣,幫助彼此發揮作用也是一個壞主意;你跳過錯誤檢查。例如,在使用結構中的數據之前,應該檢查「stat()」是否成功。 – 2012-01-18 01:17:28

+0

你的'nodes'是'char *'的向量,而不是'string'的向量。你有沒有在while循環和closedir()之間讀取代碼的末尾打印出節點列表?我不會驚訝地發現他們都指向同一個名字。 (如果稍後將它留下來進行打印,則空間可能全部被弄壞。) – 2012-01-18 01:18:52

+0

'節點'只在運行'localtime'後給我時髦的結果;在其他所有情況下,我可以在設置代碼後通過'nodes'進行循環,並查看文件名稱(使用'cout')。 – wanovak 2012-01-18 01:23:50

回答

1

它無關,與你的strftime呼叫,但與事實(從here):

通過READDIR返回的指針()指向的數據可能被覆蓋通過對同一個目錄流的另一個readdir()調用。

由於您只是推送一個指向數據的字符指針,該指針可能會被後續調用readdir覆蓋,您最終可能會發生垃圾。

你或許可以使用C字符串的副本的東西,如修復:

nodes.push_back (strdup (cur->d_name)); // plus error handling if need be. 

而且,如果您的實現沒有strdup(這不是標準的一部分),你可以使用我的(找到here)。

+0

謝謝;我懷疑在該計劃的某個時候可能有些問題。但是,當使用你的實現時,我得到以下錯誤(函數的第一行):'無效轉換從void *到char *'。我假設這是我的一個問題,並且你的代碼很好。 – wanovak 2012-01-18 01:32:41

+0

我輸入它,它工作。所以沒關係。 – wanovak 2012-01-18 01:35:30

1
nodes.push_back(cur->d_name); 

你存儲在向量立刻變得無效指針(cur有效期至下一readdirclosedir調用)。最好的解決辦法是編寫你想要的代碼 - 使nodes成爲string s的一個向量。最簡單的解決辦法:

nodes.push_back(strdup(cur->d_name));