[App 개발] c++ file io 에서 기초적인 질문입니다.
본문
그냥 콘솔형으로 하려고, gcc 를 사용해서 하고 있습니다.
파일 입출력을 위해 ifstream 을 사용하는데요,
aiff 화일로 부터 1바이트 char 형 데이터를 읽기위해서,
get() 함수를 사용하니까 작동은 하는데, 그다음에 따라 오는 long 형 데이터를
읽으려니까 막막해서요.
get() 함수보다는 직접 파일포인터를 만들어서 사용하는것이 더 좋을것 같은데,
어떻게 만들어야 할지 잘 모르겠어서요-.-ㅋ
char* 형으로 포인터를 만들어서 목적화일의 주소를 대입하려 하니,
형이 맞지 않다고 파일은 ifstream 형인데 char 형에 대입하려한다고 에러가 나오네요.
파일에서 읽으려는 첫 데이터가 char형이이서 char 형 포인터를 만들려 했던건데,
어떻게 해야할까요?
그다음에 오는 롱형 데이터를 읽는것도 문제고요..
너무 초보적인 질문이지만,
대답해 주시면 감사하겠습니다.
일단 콘솔형으로 성공하면, 맥OSX 용으로 바꾸어 볼 생각입니다.
부탁드립니다.
최신글이 없습니다.
최신글이 없습니다.
댓글목록 3
hongjuny님의 댓글
글쎄요... 제가 원하는 정답을 적고 있는 것이면 참 좋겠습니다만... ^^
ifstream::get() 함수를 사용하실 때, override 된 함수 그룹들이 다음과 같이 있습니다. (전부 다 기억은 못하겠고요... ㅡㅡ;)
int ifstream::get() : 이것은 리턴값으로 한 바이트를 읽어들이는 것이죠. 따라서 값을 받을 때 int value = ifstream.get() 뭐, 이런 식으로 하게 될 것입니다.
istream& ifstream::get( char &c ) : 이것은 한 바이트를 읽어들이는 것은 동일합니다만, 리턴값으로 받는 대신 전달되는 포인터에 값이 저장됩니다.
istream& ifstream::get( char* s, streamsize n ) : 이것은 파일내용을 c 바이트 만큼 읽어서 포인터가 가리키는 곳에 저장하게 되죠. 이것의 변형으로 get(char *s, streamsize n, char delimiter ) 가 있습니다. 이것은 마지막에 구획 문자를 넣어서 읽어들임을 중단시킬 수 있는 기능이 있죠.
소스를 보지 못해서 확실히 말씀드릴 수는 없지만, 에러가 ifstream 을 char 형에 대입하려 했다는 것을 미루어서 본다면, ifstream::get( char &c ) 멤버를 사용하신 다음 리턴값을 char 로 받으시려 했던 것 같군요.
그리고, long 형의 데이터를 읽어들이려면, 위의 get() 멤버를 이용해서 여러 바이트를 읽어서 그것을 union 이나 기타 다른 조합법으로 형 변환을 하실 수도 있지만, C++ 이니까 C++ 답게 operator >> 를 사용하시는 것도 좋을 듯 합니다. istream& operator>> (long& val );
예를 들면 이렇게 되는 거죠.
ifstream is ;
char cvalue ;
long lvalue ;
is.open( "filename.aiff" ) ;
if( is.good() ) {
is >> cvalue ; // 첫 번째 char 타입의 데이터를 읽고
is >> lvalue ; // 다음에 있는 long 타입의 데이터를 읽는다
}
is.close() ;
김태헌님의 댓글
아아아 그렇군요! 아아 감사합니다. 큰도움이 되었습니다. 역시 고수시네요! get(char &c) 를 썼었거든요. 아아아 정말 감사합니다. 다시 해보아야겠네요!
김태헌님의 댓글
아아 드디어 해결했습니다. read()함수를 사용해서 헤더 구조체 의 포인터에 구조체 사이즈 만큼 읽어 넣으니까 알아서 다 잘 들어가네요! 오호호..
그런데 사실 리눅스에서 작업했었는데, 롱형 데이터의 수치가 예상과 다르게 나와서 고민고민했었는데, CPU의 차이 때문이더군요.. 인텔계열은 리틀 엔디안을 사용하는데 aiff 는 빅 엔디안 방식(맥 같은 모토롤라 계열 CPU 는 빅엔디안 을 사용한다더군요) 이어서 빅엔디안으로 쓰여있는 데이터를 리틀엔디안으로 읽으니까 이상하게 나오더라고요. 그래서 Wave 화일을 가지고 똑같이 해보니 정상 작동 하더군요. 그럼 Aiff 는 맥에서 돌리면 정상적으로 나오겠죠? 아하하하 하여튼 감사합니다!