2

何らかの抽象化を使用してストリームを操作したいので、ifstream と ofstream の代わりに fstream* を使用したいと考えています。私はそのようにしようとしましたが、アクセス違反を引き起こします:

char* text= "test"; 
fstream* o = new fstream(); 
o = &fstream("name.txt"); 
o->write(text, 4); 
o->close();

どうすれば修正できますか、または別のアイデアを使用できますか?

この場合、ポインターを使用したい (より一般的な情報については、こちらを参照してください) C++ で独自の IO ファイル API を実装する方法

変更後は、次のようになります。

class GIO_Persistent_File_System : public GIO_CORE
{
public:
GIO_Persistent_File_System(void);
int open(char*, int);
int close();
void write(char* s, int size);
void read(char* s, int size);
public:
~GIO_Persistent_File_System(void);

private:
fstream file;
};

int GIO_Persistent_File_System::open(char* path, int mode){
file.open(path);
return 0;
}

int GIO_Persistent_File_System::close(){
file.close();
return 0;
}

void GIO_Persistent_File_System::write(char* s, int size){
file.write(s, size);
return;
}

void GIO_Persistent_File_System::read(char* s, int size){
file.read(s, size);
return;
}

主要:

GIO_CORE* plik = new GIO_Persistent_File_System();
char* test = new char[10];
char* napis = "testgs";
plik->open("name.txt", OPEN_MODE);
plik->write(napis, 2);
//plik->read(test,2);
plik->close();

そして、このコードは機能しているようですが、ファイルが見つかりません。確認したところ、現在のディレクトリが正しく指定されています (ProjectName/Debug)

私はそれをチェックし、fstreamをofstreamに変更すると正常に機能し、ファイルを見つけることができます. しかし、ある程度の抽象化を実現したいので、fstream を使用したいと思います。どうすれば修正できますか?

4

2 に答える 2

7

で行っているように、一時オブジェクトのアドレスを取得できないため、このコードではエラーが発生します&fstream("name.txt")

error: taking address of temporary

char*また、文字列リテラルから への変換は推奨されておらず、C++11 では無効であることに注意してください。const char*代わりにaを使用します。

const char* text = "test";

それにもかかわらず、あなたがやろうとしていることを見てみましょう。まず、 を動的に割り当て、fstreamそのオブジェクトへのポインターを初期化しています。

fstream* o = new fstream();

次に、次の行で一時オブジェクトを作成し、fstream("name.txt")そのアドレスを取得して割り当てますo(これにより、前述のようにエラーが発生します)。これで、動的に割り当てられたオブジェクトへのアクセスが失われfstream、代わりにo破棄された一時オブジェクトを指し示すことになります。

そのポインターを ( でo->) 逆参照すると、未定義の動作が発生します。

あなたはこれを過度に複雑にしています。fstreamオブジェクトを動的に割り当てたり、ポインターを使用したりする必要はまったくありません。代わりに、次を試してください。

fstream o("name.txt");
o.write(text, 4);
o.close();

更新されたコードでは、問題は 0 バイトを書き込んでいることです。

plik->write(napis, 0);

おそらくあなたは次のことを意味しました:

plik->write(napis, 6);
于 2013-03-28T14:11:59.667 に答える
2

へのポインターが必要になることはほとんどありませんfstream。これを行うだけです:

std::ofstream o("name.txt");
o.write(napis, 4);
o.close();

oスコープ外になると も閉じることに注意してくださいclose()

于 2013-03-28T14:13:41.530 に答える