1

ofstream によって作成されたファイルに buf ポインタの内容を書き込もうとしています。

何らかの理由でファイルは空ですが、 buf の内容は決して空ではありません...何が間違っていますか?

void DLog::Log(const char *fmt, ...)
{
    va_list varptr;

    va_start(varptr, fmt);

    int n = ::_vscprintf(fmt, varptr);
    char *buf = new char[n + 1];
    ::vsprintf(buf, fmt, varptr);

    va_end(varptr);

    if (!m_filename.empty())
    {

        std::ofstream ofstr(m_filename.c_str(), ios::out);

        ofstr << *buf; // contents of *buf are NEVER empty, however nothing is in file??

        ofstr.close();
    }


    delete [] buf;
}
4

5 に答える 5

4

ストリームに書き込む前にストリームを開いていますか? 不十分なディスク容量から不十分なアクセス許可まで、さまざまな可能性があります。

また、次のエラーが発生する場合があります。

ofstr << *buf;

次のようになります。

ofstr << buf;

bufは であるためchar*、ではなく*bufを返します。charchar*

これは、std::string生のバッファ/ポインタの代わりに使用することが理にかなっている場所です;)

于 2010-07-19T09:21:32.893 に答える
3

多くの問題は、手動の割り当て管理など、毛むくじゃらのものを取り除くことで解決できます。

コードで使用new T[N]しないでください。代わりに を使用してくださいstd::vector<T> v(N);。ポインターが邪魔にならないので、これだけで問題が解決する可能性があります。

void DLog::Log(const char *fmt, ...)
{
    va_list varptr;
    va_start(varptr, fmt);

    int n = ::_vscprintf(fmt, varptr);
    std::vector<char> buf(n + 1);

    ::vsprintf(&buf[0], fmt, varptr);

    va_end(varptr);

    if (!m_filename.empty())
    {
        std::ofstream ofstr(m_filename.c_str(), ios::out);
        if (!ofstr) 
        {
            // didn't open, do some error reporting here
        }

        // copy each character to the stream
        std::copy(buf.begin(), buf.end(), std::ostream_iterator<char>(ofstr));

        // no need to close, it's done automatically
    }

    // no need to remember to delete
}

読み取りと保守がはるかに簡単です。であることに注意してstd::string buf(n + 1);くださいofstr << buf;。残念ながら、std::string現在、 のように要素を連続して格納する必要はありませんstd::vector。これは、 の行が&buf[0]動作することが保証されていないことを意味します。そうは言っても、それが機能しない実装が見つかるとは思えません。それでも、保証された動作を維持する方が間違いなく優れています。

ただし、問題はポインターを逆参照していると思われます。

于 2010-07-19T10:39:56.317 に答える
1

オフストリームを閉じる前にフラッシュする必要があります。少し前に、ストリームを閉じると自動的にフラッシュされると思っていたときにこのエラーが発生するofstr.flush();前に試してみてください。ofstr.close();

于 2010-07-19T09:31:14.803 に答える
1

エラーは並んでいます

ofstr << *buf;

そのはず

ofstr << buf;

于 2010-07-19T09:25:53.793 に答える
0

作成後、ofstream が書き込み用に開かれていることを確認する必要があります。

于 2010-07-19T09:20:16.077 に答える