2013-03-28 3 views
1

일부 추상화를 사용하여 스트림을 조작하고자하므로 ifstream 및 ofstream 대신 fstream *을 사용하려고합니다. 나는 그런 일을하려고했지만 액세스 위반을 야기 할 때까지fstream 포인터를 사용하여 파일을 조작하려면 어떻게해야합니까?

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

어떻게 해결할 수 있습니까? 아니면 다른 생각을 사용할 수 있습니까? 주요

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(); 

나는 지금이 모양 변경 후 How to implement my own IO file API in C++

을 (당신은 더 일반적인 정보는 여기를 찾아보실 수 있습니다)이 경우 포인터를 사용하려면

그리고이 코드는 정상적으로 작동하는 것처럼 보입니다 파일을 찾을 수 없습니다. 내가 확인하고 현재 디렉토리가 올바르게 가리 킵니다 (ProjectName/Debug)

fstream을 ofstream으로 변경하면이 제대로 작동하므로 파일을 찾을 수 있습니다. 그러나 어느 정도의 추상화를 이루기 위해서는 fstream을 사용하고 싶습니다. 어떻게 해결할 수 있습니까?

+2

이 코드는 액세스 위반이 발생하지 않도록 오류를 제공합니다. –

+0

세 가지 컴파일러 오류가 나타납니다. – chris

+0

여기에 포인터를 사용하는 이유는 무엇입니까? 그렇게함으로써 아무 것도 얻지 못하고 있습니다. – andre

답변

8

이 코드는 &fstream("name.txt")과 같이 임시 개체의 주소를 가져올 수 없기 때문에 오류가 발생합니다.

error: taking address of temporary 

는 또한, char* 리터럴 문자열에서 변환이되지 않는 및 C++ (11)의 유효되어 있습니다. const char* 대신 사용

그럼에도 불구하고
const char* text = "test"; 

, 이제 당신이해야 할을 시도 을하는지 살펴 보자. 첫째, 당신은 동적으로 fstream을 할당하고 해당 개체에 대한 포인터를 초기화하는됩니다

fstream* o = new fstream(); 

그런 다음 다음 줄에, 당신은 fstream("name.txt")와 임시 객체를 생성 한 후 해당 주소를 가지고와를 제공하는 (o에 할당 오류, 우리가 본 것처럼). 이제 동적으로 할당 된 fstream에 대한 액세스 권한을 잃어 버렸고 o이 이제 삭제 된 임시 객체를 가리키게됩니다.

해당 포인터를 역 참조하면 (o->) 정의되지 않은 동작이 발생합니다.

당신은 이것을 과장하고 있습니다. fstream 오브젝트를 동적으로 할당하거나 포인터를 사용하지 않아도됩니다.대신, 시도 :

plik->write(napis, 0); 

아마도 당신은 의미 :

plik->write(napis, 6); 
+0

C++에서는 더 이상 사용되지 않으며 완전히 허용되지 않습니다. – chris

+0

@chris 좋은 지적! 업데이트 됨. –

+0

fstream o를 사용하는 경우 클래스의 헤더 파일에서 초기화했다. 그리고 나서 Open (char * path) 클래스에서 o = fstream (path)을 수행하려고하면 컴파일 오류가 발생합니다. 그래서 포인터를 사용하고 싶습니다. – rank1

2

좀처럼있다 업데이트 된 코드와

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

, 문제는 당신이 0 바이트를 작성하는 것입니다 포인터가 있어야합니다. ~ fstream입니다. 그냥 이렇게 :이 범위를 벗어나면

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

공지 사항 o 것으로도 가까운, 너무 자주 당신도 close()를 호출 할 필요가 없습니다 것입니다.