C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[343] SAMI 파일의 읽기의 쓰기.
유지상 [newjisang] 7790 읽음    2002-06-03 00:18
확장자 *.smi를 가지는 자막파일(이른바, SAMI) 를 읽어들이고, 그리고 또한 그 자막파일을 자동으로 작성하는 예제.

NOTE: 글의 끝부분이 깨졌을 경우는, 첨부파일을 다운받아서 보세요.

/////////////////////////////////////////////////////////
Created by Jisang Yoo for the use in 'LanguageMaster'
/////////////////////////////////////////////////////////

class TSubtitle
{
private:
  String text[MaxLine];   // 각각 켑션.
  int start[MaxLine];    // 각 켑션의 시작시간. milisecond단위.
int FLineCount;     //전체 켑션개수.
  String __fastcall GetText(int Index);
  int __fastcall GetStart(int Index);
  int __fastcall GetEnd(int Index);
public:
  void LoadFromSamiFile(String filename, String BR = "\n");
  void LoadFromSubripFile(String filename);
  void LoadFromSubviewer2File(String filename);
  void LoadFromMicrodvdFile(String filename, float FPS=25);
  void SaveToSamiFile(String filename) const;
  TSubtitle();
  void Compress();
  __property int LineCount  = { read=FLineCount };
  __property String Text[int Index]  = { read=GetText };
  __property int Start[int Index]  = { read=GetStart };

};

TSubtitle::TSubtitle()
:FLineCount(0)
{}

String __fastcall TSubtitle::GetText(int Index)
{
  if (0<=Index && Index<FLineCount)
    return text[Index];
  else
    return String("");
}

int __fastcall TSubtitle::GetStart(int Index)
{
  if (0<=Index && Index<FLineCount)
    return start[Index];
  else
    return 0;
}

void TSubtitle::SaveToSamiFile(String filename) const
{
  FILE* fp = fopen(filename.c_str(),"w");
  if(fp == NULL)
    return;

  fputs("<SAMI>\n\n\nAlbert Einstein\n\n\n\n\n",fp); String Temp, Temp2; int x,sp; for(int i=0 ; i\n"; fputs( Temp.c_str() , fp); Temp = text[i].Trim(); x = 0; // for error check. while(sp = Temp.Pos("\n") , sp) // { if (x++>5) break; //예외처리 무한루푸 방지 Temp2 = Temp.SubString(1,sp-1); Temp = Temp2 + "
" + Temp.Delete(1,sp); } Temp += "\n"; fputs( Temp.c_str() , fp); } fputs("\n</SAMI>\n",fp);

  fclose(fp);
}

void TSubtitle::LoadFromSamiFile(String filename, String BR /*= "\n"*/)
{   /*     SAMI (*.smi , *.smil)
ex)
<SAMI>
"A Few Good Man"

Captain, I'd like to request that
it be me who's the attorney ...


</SAMI>        */

/* SMPlay의 소스코드를 참조하고 변형*/

  int i ;  char buf[201]; String CurLine, Upper ,Temp;     int sp,sp2;

  FILE* fp = fopen(filename.c_str(),"r");
  if(fp==NULL)
     return;

  //skip until '' appears while (fgets(buf,200,fp)) if (String(buf).UpperCase().AnsiPos("") ) break; i = 0; start[0] = 0; while (fgets(buf,200,fp) && i' and reading the 'start[i]'. if(CurLine.UpperCase().Pos(""); start[i] = CurLine.SubString(sp+1,sp2-sp-1).ToInt(); text[i] = ""; CurLine.Delete(1,sp2); } int x = 0; // for error check. while(Upper = CurLine.UpperCase(), sp = Upper.Pos("&NBSP") , sp) //replacing '&NBSP' or '&NBSP;' with ' ' { if (x++>5) break; //예외처리 무한루푸 방지 int len = 5; if(Upper.SubString(sp,6) == "&NBSP;") len = 6; Temp = CurLine.SubString(1,sp-1); CurLine = Temp + ' ' + CurLine.Delete(1,sp+len-1);; } while(sp = CurLine.Pos("<") ,sp) //replacing '
' and deleting '< ????? >' { if (x++>5) break; //예외처리 무한루푸 방지 if(CurLine.SubString(sp,4) == "
" || CurLine.SubString(sp,4) == "
" ) { //TODO: Temp = CurLine.SubString(1,sp-1); CurLine = Temp + BR + CurLine.Delete(1,sp+3); } else { sp2=Upper.Pos(">"); Temp = CurLine.SubString(1,sp-1); CurLine= Temp + CurLine.Delete(1,sp2); } } text[i] += CurLine; } FLineCount = i+1; fclose(fp); } void TSubtitle::Compress() { int k =0; for(int i=0; i

김백일.cedar [cedar]   2002-06-03 09:48 X
글쓰기 창에 붙인 소스가 깨져 있네요. 수정바랍니다.
Jisang Yoo [newjisang]   2002-06-04 19:50 X
수정해도 계속 끝부분이 깨지는데, 글이 너무 길었거나 아니면 게시판 버그인 것 같습니다.
Jisang Yoo [newjisang]   2002-06-04 19:51 X
그래서, 똑같은 소스코드를 첨부파일로 첨부하였습니다.
최준호.스페로 [sparrow]   2002-06-13 23:07 X
ㅋㅋ smplay 개발자입니다. 소스를 리소스 개시판에 올려 놧음다..
최준호.스페로 [sparrow]   2002-06-13 23:08 X
어떤 분이라도 자막 파싱 부분을 개선 해서 좀더 좋은 플레이어 만드세요~~

+ -

관련 글 리스트
343 SAMI 파일의 읽기의 쓰기. 유지상 7790 2002/06/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.