web-dev-qa-db-ja.com

テキストファイルを作成し、C ++で書き込みますか?

Visual C++ 2008を使用しています。テキストファイルを作成して書き込みたいのですが。

char filename[]="C:/k.txt";
FileStream *fs = new FileStream(filename, FileMode::Create, FileAccess::Write);
fstream *fs =new fstream(filename,ios::out|ios::binary);
fs->write("ghgh", 4);
fs->close();

ここにFileStreamのエラーが表示されています

13
user637429

fsを2つの異なる方法で2回宣言しているため、エラーが発生します。しかし、C++とC++/CLIの奇妙な組み合わせであるため、そのコードは一切保持しません。

あなたの質問では、標準のC++を実行するか、C++/CLIを実行するかが明確ではありません。 「通常の」C++が必要だとすると、次のようにする必要があります。

#include <fstream>
#include <iostream>

// ...

int main()
{
    // notice that IIRC on modern Windows machines if you aren't admin 
    // you can't write in the root directory of the system drive; 
    // you should instead write e.g. in the current directory
    std::ofstream fs("c:\\k.txt"); 

    if(!fs)
    {
        std::cerr<<"Cannot open the output file."<<std::endl;
        return 1;
    }
    fs<<"ghgh";
    fs.close();
    return 0;
}

C++では不要なため、newのすべてを削除したことに注意してください。通常のように、スタックにストリームオブジェクトを割り当てて、コードに存在していたメモリリークを忘れることができます。 (GCで管理されていない)ポインターはガベージコレクションの対象ではありません。

14
Matteo Italia

ネイティブとマネージの両方のC++の例を以下に示します。

ネイティブソリューションに満足していると仮定すると、次のコードは問題なく機能します。

    fstream *fs =new fstream(filename,ios::out|ios::binary); 
fs->write("ghgh", 4); 
fs->close(); 
delete fs;      // Need delete fs to avoid memory leak

ただし、fstreamオブジェクト(つまり、新しいステートメントとポイント)には動的メモリを使用しません。これが新しいバージョンです:

    fstream fs(filename,ios::out|ios::binary); 
fs.write("ghgh", 4); 
fs.close();

編集、質問はネイティブソリューションを要求するように編集されました(当初は不明確でした)が、誰かに役立つ可能性があるため、この回答は残しておきます

C++ CLIオプション(マネージコード用)を探している場合は、FileStreamではなくStreamWriterを使用することをお勧めします。 StreamWriterを使用すると、マネージ文字列を操作できます。 deleteはIDisposableインターフェイスのDisposeメソッドを呼び出し、Garbage Collectedは最終的にメモリを解放することに注意してください。

StreamWriter ^fs = gcnew StreamWriter(gcnew String(filename));
fs->Write((gcnew String("ghgh")));
fs->Close();
delete fs;
4
David Cravey