• 북마크
  • 추가메뉴
어디로 앱에서 쉽고 간편하게!
애플 중고 거래 전문 플랫폼
오늘 하루 보지 않기
KMUG 케이머그

소프트웨어

[App 개발] c++ file io 에서 기초적인 질문입니다.

본문

Aiff 화일 헤더분석하는 프로그램을 만들어보려고 하는데요,

그냥 콘솔형으로 하려고, gcc 를 사용해서 하고 있습니다.

파일 입출력을 위해 ifstream 을 사용하는데요,

aiff 화일로 부터 1바이트 char 형 데이터를 읽기위해서,

get() 함수를 사용하니까 작동은 하는데, 그다음에 따라 오는 long 형 데이터를

읽으려니까 막막해서요.

get() 함수보다는 직접 파일포인터를 만들어서 사용하는것이 더 좋을것 같은데,

어떻게 만들어야 할지 잘 모르겠어서요-.-ㅋ

char* 형으로 포인터를 만들어서 목적화일의 주소를 대입하려 하니,

형이 맞지 않다고 파일은 ifstream 형인데 char 형에 대입하려한다고 에러가 나오네요.

파일에서 읽으려는 첫 데이터가 char형이이서 char 형 포인터를 만들려 했던건데,

어떻게 해야할까요?

그다음에 오는 롱형 데이터를 읽는것도 문제고요..

너무 초보적인 질문이지만,

대답해 주시면 감사하겠습니다.

일단 콘솔형으로 성공하면, 맥OSX 용으로 바꾸어 볼 생각입니다.

부탁드립니다.
0 0
로그인 후 추천 또는 비추천하실 수 있습니다.
포인트 376
가입일 :
2003-12-29 23:10:04
서명 :
미입력
자기소개 :
미입력

최신글이 없습니다.

최신글이 없습니다.

댓글목록 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 는 맥에서 돌리면 정상적으로 나오겠죠? 아하하하 하여튼 감사합니다!

전체 4 건 - 1 페이지
2004.05
15

[App 개발] 맥에서 Qt 사용 어떤가요?

사운드신세시스 프로그래밍을 공부하는데요 아무래도 GUI 가 필요해서 GUI 프로그래밍을 보려하는데, 리눅스환경에서 만들고 있어서 Qt 를 사용해서 GUI 를 만들어보려고요. 그런데 Qt 소개를 자세히 보니까 멀티플랫폼 API 이어…

2004.02
10

[App 개발] 10 bytes extended 형 데이터 처리.

안녕하세요 계속해서 Aiff 파일을 공부하고 있는데요. 헤더에 들어가있는 short, long, char 등의 데이터형의 데이터는 쉽게 읽고 쓸수가 있는데, Wave 화일과는 달리 Aiff 파일은 Sample Rate 를 기록하는 데이…

2004.02
01

열람중 [App 개발] c++ file io 에서 기초적인 질문입니다.

Aiff 화일 헤더분석하는 프로그램을 만들어보려고 하는데요, 그냥 콘솔형으로 하려고, gcc 를 사용해서 하고 있습니다. 파일 입출력을 위해 ifstream 을 사용하는데요, aiff 화일로 부터 1바이트 char 형 데이터를 읽기위해…

2003.12
29

[App 개발] 오디오 어플리케이션을 개발하고 싶습니다.

아직 맥을 가지고 있지는 않지만, 매킨토시 기반으로 오디오 프로그램을 개발하고 싶습니다. 혹시 맥으로 소프트 신서나 브이에스티 플러그인등을 개발하는것에 관심이 있으신분이 계신가요 제가 아직 초보라서 모르는것이 너무 많습니다…