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++,因此将给予“接受”以坚定地朝着正确的方向推进。

谢谢你。

4

2 回答 2

1
nodes.push_back(cur->d_name);

您将指针存储在立即变为无效的向量中(cur在下一次readdirclosedir调用之前有效)。最好的解决办法是编写你想要的代码——制作nodes一个 s 的向量string。最简单的修复:

nodes.push_back(strdup(cur->d_name));
于 2012-01-18T01:19:55.827 回答
1

它与您的电话无关,但与(从这里strftime的事实有关:

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

由于您只是推送一个指向可能被后续调用覆盖的数据的字符指针,因此您很可能会得到readdir垃圾。

您可能可以通过使用C 字符串的副本来修复它,例如:

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

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

于 2012-01-18T01:21:28.260 回答