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すぐに無効になる(次の呼び出しreaddirまたは呼び出しまで有効な)ポインタをベクトルに格納していますclosedir。最善の解決策は、必要なものをコーディングすることです。つまり、 sのnodesベクトルを作成します。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 に答える