0

複数行のテキストを含む stringstream があります。

例えば、

f.html                            Sat Oct 19 22:59:47 2013         23675
folder                            Mon Nov  4 19:36:14 2013         4096
readdirpractice.cpp               Tue Nov  5 03:00:10 2013         1203
server.cpp                        Mon Nov  4 21:22:27 2013         11369
photo.jpg                         Wed Oct 23 01:45:04 2013         4360
qq                                Sun Nov  3 01:54:36 2013         66031
server.cpp~                       Mon Nov  4 21:22:25 2013         11368
myhttp.cpp                        Sun Nov  3 01:43:09 2013         1816
getoptpractice.cpp~               Sun Nov  3 01:15:25 2013         1324

これは、stringstream が通常どのように見えるかです。

この stringstream を string に変換すると、情報は同じでした。

ただし、これを C 文字列に変換すると、最初の行だけが取得され、他の行はすべて失われます。

持っているだけ

f.html                            Sat Oct 19 22:59:47 2013         23675

変換後。

これはなぜですか、どうすれば修正できますか?

コードの一部を添付します。

if(is_dir) {
    char dirname[1024];
    strncpy(dirname, requests[1].c_str(), sizeof(dirname));
    dirname[sizeof(dirname)-1] = 0;

    DIR           *d;
    struct dirent *dir;
    d = opendir(dirname);
    stringstream ss;
    if (d) {
        while ((dir = readdir(d)) != NULL) {
            char* file = dir->d_name;
            if(file[0] != '.') {
                struct stat sb;

                if (stat(file, &sb) == -1) {
                    cerr << "stat error" << endl;
                    exit(EXIT_FAILURE);
                }

                char* lm = ctime(&sb.st_mtime);
                string lastmod(lm);
                lastmod.at(lastmod.size()-1) = '\0';
                string spacing = "                                  ";
                ss << file << spacing.substr(0, spacing.size() - strlen(file)) << lastmod << spacing.substr(0, spacing.size() - lastmod.size()) << sb.st_size << '\n';
            }
        }
        closedir(d);
    }
    //cout << ss.str() << endl; // for testing
    char msg2[10000];
    strncpy(msg2, ss.str().c_str(), sizeof(msg2));
    msg2[sizeof(msg2)-1] = 0;
    msg = msg2;
4

3 に答える 3

2

には、C 文字列として解釈されたときにシーケンスを途中で終了させる (NUL) 文字std::stringが埋め込まれている可能性があります。'\0'char

を使用して NUL バイトを消去してみてくださいstd::remove

編集 - これはあなたの問題かもしれません:

             lastmod.at(lastmod.size()-1) = '\0';

これは単にトラブルを求めているだけです。std::stringNUL バイトを忠実に保存し、それを出力にコピーしました。

于 2013-11-05T08:52:39.660 に答える
1

コメントによると、「msg」が戻り値であることを示しました。

char msg2[10000];
strncpy(msg2, ss.str().c_str(), sizeof(msg2));
msg2[sizeof(msg2)-1] = 0;
msg = msg2;

「msg2」は、ローカル変数として、つまりスタック上に作成されています。次に、stringstream をこのスタック領域にコピーし、(スタック上の) 文字列のアドレスを取得して関数を終了します。その時点で、スタックのその領域は解放され、アプリケーションの他の部分によって使用されます。

文字列用にヒープにメモリを割り当てるか、呼び出し元の関数からストレージを渡す必要があります。

すでに文字列操作を行っているため、 std::string を使用して管理オーバーヘッドをカプセル化するのが最も論理的です。引数として標準文字列への参照を取得します。

void getDirListing(std::string& msg) {
}

そして、

std::string dirListing = "";
getDirListing(dirListing);
于 2013-11-05T09:04:02.053 に答える
1

これらの行は疑わしく見えます:

string lastmod(lm);
lastmod.at(lastmod.size()-1) = '\0';

文字列クラス インスタンスの途中に null char を挿入すると、予期しない動作が発生する可能性があります (印刷時に文字列が途中で終了するなど)。

これを行う必要はないと思います。行を削除してみてくださいlastmod.at

于 2013-11-05T09:05:22.877 に答える