1

2 つのディレクトリを別のディレクトリ内に作成したいと考えています。ディレクトリの名前はランダムに生成されます。stat()しかし、関数の奇妙な動作に遭遇しました。

stat()for を呼び出すたびにがdirname_返されます0。しかし、中にファイルはありませんworkdir_。私のコードで何が間違っているのかまだわかりません。

コンパイル日Linux computer 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:43:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

ソースは次のとおりです。

#include <string>
#include <stdexcept>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>


const std::string _randomStr(const int len) {
    static const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    std::string s(len + 1, 0);
    for (int i = 0; i < len; ++i) {
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    }
    return s;
}

int main(void)
{
    std::string workdir_;
    std::string dirname_;
    struct stat sb;
    int err = 0;

    do {
        workdir_ = "./" + _randomStr(10);
    } while (0 == ::stat(workdir_.c_str(), &sb));
    err = ::mkdir(workdir_.c_str(), 0755);
    if (err)
        throw std::runtime_error("failed to initialize directory");
    std::cout << "workdir: " << workdir_ << std::endl;

    do {
        dirname_ = workdir_ + "/" + _randomStr(10);
    } while (0 == ::stat(dirname_.c_str(), &sb));
    err = ::mkdir(dirname_.c_str(), 0755);
    if (err)
        throw std::runtime_error("failed to initialize directory");
    std::cout << "dirname : " << dirname_ << std::endl;     
    return 0;
}
4

1 に答える 1

3

に偽物\0がありますdirname_。ループ内でディレクトリ名を出力して strace を実行すると、出力は次のようになります。

write(2, "dirname : ", 10)              = 10
write(2, "./zLOZ2nOXpP\0/7U20o0J90x\0", 25) = 25
write(2, "\n", 1)                       = 1
stat("./zLOZ2nOXpP", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0

したがって、cerrまたはcout文字列を (その長さを使用して) 正しく出力しますが、C-String に変換するとc_str()、結果は最初のディレクトリ名のみになり、次に に渡されstat()ます。

于 2013-07-29T07:15:26.973 に答える