localtime替代,不会覆盖提供的结构

时间:2012-01-18 01:11:27

标签: c++ linux localtime

基本上,我要做的是检查文件的最后访问时间并将其与字符串进行比较。这是相关的块:

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 ++,所以在正确方向上的坚实推动将被赋予'接受'。

谢谢。

2 个答案:

答案 0 :(得分:1)

nodes.push_back(cur->d_name);

您正在向量中存储指针,该指针会立即变为无效(cur在下一次readdirclosedir调用之前有效)。最好的解决方法是编写您想要的代码 - 将nodes设为string的向量。最简单的解决方法:

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

答案 1 :(得分:1)

它与您的strftime电话无关,但事实是(来自here):

  

readdir()返回的指针指向可能被同一目录流上另一个readdir()调用覆盖的数据。

由于您只是推送指向可能被后续readdir调用覆盖的数据的字符指针,因此最终可能会产生垃圾。

你可以通过使用C字符串的 copy 修复它,例如:

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

而且,如果您的实施没有strdup(它不是标准的一部分),您可以使用我的(找到here)。