0

私はそれがどのように存在するのか本当に理解できないという問題を抱えています。

時間順に並べられた、たくさんのオブジェクトを含むたくさんのファイルがあります。結果は、オブジェクトごとのディレクトリで順序付けられた時間ごとに1つのファイルになるはずです。

非常にうまく機能しますが、を使用するように変換した時点でOutputstringchar[]配列fstream.open()の文字列は文字列より3文字多くなっています。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
    string strOutput;
    char *OutputFile;
    short z;

    strOutput = "/home/.../2046001_2013-02-25T0959.txt";
    cout << strOutput << endl;

    OutputFile = new char[strOutput.length()];
    z = 0;
    while (z < strOutput.length())
    {
            OutputFile[z] = strOutput[z];
            z++;
    }

    cout << OutputFile << endl;

    return 0;
}

最初の出力は常に正しいですが、2番目の出力の末尾がまたはである場合が.txt60Aあり.txt5.aます.txt9.A。それが発生すると、常に同じオブジェクトと時間が発生し、試行するたびに発生します。しかし、すべてのオブジェクトがそれを行うわけではありません。

明らかな理由で、この最小限のコードスニペットではこのエラーを再現できませんが、390行のコード全体を投稿したくありません。

何か提案はありますか?

4

3 に答える 3

4

C文字列の最後にnullを終了することがありません。修正するには:

OutputFile = new char[strOutput.length() + 1]; // notice +1
z = 0;
while (z < strOutput.length())
{
    OutputFile[z] = strOutput[z];
    z++;
}
OutputFile[z] = 0; // add terminating 0 byte

もちろん、すべてを行うためのより良い方法があります...実際にはまったくコピーする必要はありません。OutputFileループ全体を削除して、内部のchar配列を使用するだけstd::stringです。

cout << strOutput.c_str() << endl;

実際のコードにはC文字列が必要だと思います。もちろん、直接std::cout印刷できます。std::string

cout << strOutput << endl;

実際にコピーを作成する場合は、それをコピーstd::stringして保存し、必要なときにc_str-methodを使用してCバッファーを取得することをお勧めします。

string OutputFile = strOutput;

ヒープから割り当てられた生のchar配列が本当に必要であることがわかっている場合はstd::unique_ptrポインターをラップするために(または他のC ++スマートポインタークラス)を使用する必要があります。これにより、手動で削除してメモリリークを回避する必要がなくなり、標準を使用することもできます。コピーを行うライブラリ関数:

#include <memory>
#include <cstring>

..。

unique_ptr<char[]> OutputFile(new char[strOutput.length() + 1];
::strcpy(OutputFile, strOutput.c_str()); // :: means top level namespace
于 2013-03-15T15:39:14.807 に答える
1

Char配列には、余分なnull文字が必要であるか、\0末尾に追加されます。そうでない場合、文字列を読み取るコードは、配列が見つかるまで配列の末尾を超えて実行されます。

OutputFile = new char[strOutput.length() + 1];
z = 0;
while (z < strOutput.length())
{
    OutputFile[z] = strOutput[z];
    z++;
}
OutputFile[z] = '\0';

配列の次のバイトがたまたまnullの場合は機能しているように見えるかもしれませんが、それは単なる偶然です。それがあなたのコードが最初のパスで機​​能する理由だと確信しています。

于 2013-03-15T15:39:14.527 に答える
0

fstream.open()を使用するためにOutputstringをchar[]に変換した時点で

あなたはそれをする必要はありません。代わりに次のようなことをしてください:

outfile.open(Outputstring.c_str(), std::fstream::out)

もちろん、C ++ 11準拠のコンパイラを使用している場合は、次のことを実行できます。

outfile.open(Outputstring, std::fstream::out)
于 2013-03-15T15:54:55.550 に答える