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

C++빌더 Q&A
C++Builder Programming Q&A
[74492] Re:Re: C++ template 이용 ...
량이 [] 3709 읽음    2017-07-24 09:40
빌더(TWx) 님이 쓰신 글 :
: 량이 님이 쓰신 글 :
: : void __fastcall TForm1::LoginClick(TObject *Sender)
: : {
: :     char inputString[3];
: :     String ID;
: :     ifstream inFile("c:\\C++ Builder\\LogIn.txt", ios::app);
: :     while(!inFile.getline(inputString,sizeof(inputString)).eof()){
: :     ID = inputString[1];  -----------//문제점
: :     inFile.seekg(0,inFile.beg);
: :     ShowMessage(ID);
: :     if(strcmp(InputID->Text.c_str(),ID.c_str()) == 0){
: :     Form1->Hide();
: :     LoginModuel->Show();
: :     Form1->Hide();
: :     inFile.close();
: :
: :     }
: :     else{
: :     ShowMessage("Could not find a match for ID or Password");
: :     break;
: :     }
: :     }
: : }
: : 문제점에 있는녀석이 메모장에 이름 아이디 비밀번호순으로 읽어들이게 만들려고하는데 자꾸 아이디부분의 문자순서를 읽어들여요
: : ex)STRING <-- STRING 전체를 받아와야하는데 두번째인 T만 받아오네요 ㅠ.ㅠ
:
:
:
: 답변:
:
:
: 편의상 <test.txt> 파일에 아래와 같은 3줄의 라인이 있다고 합시다.
:
: <test.txt>
:
: c++ builder
: visual studio 2017
: delphi 10.2
:
:
: 첫번째 방법으로...
: 여러 라인을 갖고있는 텍스트 파일로 부터 한 라인씩 순차적으로 읽어서 처리하려면...
:
: void checkLine()
: {
:     std::ifstream inFile("c:/test/test.txt");
:
:     for (std::string s; std::getline( inFile, s ); ) {
:         if ( String(s.c_str()) == Edit1->Text ) { // Edit1->Text = "visual studio 2017"
:             ShowMessage("found: visual studio 2017...");
:             return;
:         }
:     }
:     ShowMessage("not  found");
: }
:
:
:
:
: 두번째 방법으로...
: 한 라인씩 읽어들이는 방법 말고, 전체 라인을 한번에 읽어 들여놓고 나중에 후처리 하려면...
:
: std::vector<std::string> inputArray;
:
: // template specialization 이용
: namespace std
: {
:     template<> istream &operator>>(std::istream &istr, std::string &str)
:     {
:        return getline(istr, str);
:     }
: }
:
: void loadLines()
: {
:     std::ifstream inFile("c:/test/test.txt");
:
:     std::copy( std::istream_iterator<std::string>(inFile),
:                std::istream_iterator<std::string>(),
:                std::back_inserter(inputArray) );
: }
: void checkLine()
: {
:     for ( int i=0; i < inputArray.size(); ++i ) {
:         if ( String(inputArray[i].c_str()) == Edit1->Text ) { // Edit1->Text = "visual studio 2017"
:             ShowMessage("found: visual studio 2017...");
:             return;
:         }
:     }
:     ShowMessage("not  found");
: }
:
: 위와 같이 std::copy를 이용해서 라인별로 vector에 전체라인을 미리 로드할 수 있습니다.
:
:
: 그런데 istream의 >> 오퍼레이터는 디폴트로 라인 단위가 아닌, 워드 단위로 동작하기 때문에 처리가 필요한데...
: 이걸 위해 클래스 만든다고 수선 떨 필요 없이, 위와 같이 간단하게 template specialization 기능을 이용해서 처리하면 됩니다.
:
: template 테크닉을 잘 써먹으면 몇 줄 안되는 코드만으로도 간단한 에디터를 쉽게 만들 수 있죠.

감사합니다. 덕분에 원활하게 해결됬습니다.
그런데 한가지 더 물어보고 싶은게 있는데 텍스트 파일을 3줄씩 끊어서 읽어오게 할수있을까요?
EX) 1234
      5678
      5667      <-3줄읽고
      abcd
      efgh
      cccc      <-3줄읽고
이런식으루 할수있으면 좋겠는데 로그인페이지를 만드는중에 다른아이디와 텍스트에 있는 비밀번호가 아무거나 맞으면 로그인되더라구요

+ -

관련 글 리스트
74488 String이 라인으로 읽어들이는게 아니라 문자순서로 읽어들여요 량이 3628 2017/07/21
74491     Re: C++ template 이용 ... 빌더(TWx) 3744 2017/07/23
74492         Re:Re: C++ template 이용 ... 량이 3709 2017/07/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.