태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

일반 C를 사용하여 Token을 하는 경우에는 그냥 strtok를 보통 사용하였습니다.

그러나 C++을 사용하게 될 때 구현하기 귀찮(?)아서 기존의 C 라이브러리 함수를 이용하게 되는데, 개인적으로

가장 자주 사용하는것이 strtok와 atoi입니다.

비주얼 스튜디오 2005 이후에서는 strtok를 이용하면 경고를 출력해줍니다.

이를 무시하고 코딩을 하는 경우가 많았는데........이를 무시하면 정말..무시무시한 디버깅의 세계로 빠져들 수 있으니 항상 조심하셔야합니다.


결론부터 말씀드리자면..strtok 함수는 비주얼 스튜디오 6.0 에서는 정상 작동하나, 그 이후 버전에서는

실행은 되지만 뒤에 쓰레기 값이 박히는 경우가 종종 발생합니다.

이를 대체하기 위해서 strtok_s를 이용하게 됩니다. 사용법은 아래 링크를 타고 가시면 됩니다.

출처 : http://harmonize84.tistory.com/112 

그런데 여기서 한가지 더 문제..strtok_s를 윈도우에서만 존재하는 함수라는 것입니다..

즉, 리눅스에서 같은 소스를 실행하면 에러가 난다는 것입니다.(물론 g++ 컴파일러 사용..)

그래서 다시 strtok로 변경하게 되면..쓰레기 값은 출력되지 않으나..자세히 보면 정상적인 출력이 아닌 경우가 발생합니다.

그래서 여기서 해결 방법은 strtok_r을 이용하는것입니다.

사용법은 man 페이지를 참고하세요 ~_~)~
namespace....

솔직히 전에 듣기로는 그냥 타자 여러번 치기 힘드니까 쓰는 것이라고 이해했습니다.

물론 맞는 말이기도 한 것 같습니다 =_-;

그런데 오늘 www.winapi.co.kr(나의 절대적인 레퍼런스)에서 심심해서 강의를 보는 도중 namespace

에 대해서 나와있었습니다.

"오..그렇구나..오? 오~ 오!!!! 대박인데!!!"

라고 생각을 하며 아래와 같은 소스를 실험해 봤습니다.

namespace me
{
    int a;
    int b;
    void print();
    class Test
    {
       
    };
}
void me::print()
{
    cout<<"!!"<<endl;
}

int main()
{
    me::a = 10;
    me::Test d;
    cout<<me::a<<endl;
    me::print();
    return 0;
}

결론은 다 됩니다..

구조체든..클래스든..뭐든지 간에 다 들어가서 박힐 수가 있습니다.

순간 번뜩!! 하면 뇌리를 스친 것이 있는데.....

그렇다면...클래스끼리 묶어두면 좋지 않을까? 하는 생각이 들었습니다.

함수끼리 묶어서 클래스 만들 듯이 클래스끼리 묶어서 namespace 안에 넣어두는..

그래서 선배님께 여쭤보았더니

"원래 이렇게 쓰잖아~"

두둥....역시 선배님은 모르는게 없습니다 =ㅅ=;;;

대학교 4학년에 이제야 깨우친..namespace.......

도대체 이런 것들은 누구에게 배워야 하는지..ㅠ_ㅠ

아무튼..오늘도 뇌에 나노미터의 줄을 하나 더 그었군요 =ㅅ-)v

간만에 C++로 파일처리를 좀 하려니까..초반부터 캐 삽질을 했습니다.

일단 소스를 보시죠.

================[소스내용]====================

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void main()
{
 fstream ComeIn;
 string temp;
 char ss;
 int i=0;
 ComeIn.open("한글.txt",ios::in);
 while(1)
 {  
  if(ComeIn.fail())break;
  ComeIn >> temp;
  cout<<temp<<endl;  
  i++;
 }
 cout<<i<<endl;
 cout<<"End of Classification!!!"<<endl;
 ComeIn.close();
}
=======================[소스 끝]===============================

저렇게 했더니 이 놈이 캐 삽질을..파일을 아예 찾지도 못하더군요..

그래서 혹시나 해서 ComeIn.Open("한글.txt",ios::in)  이 부분을 ComIn.Open("asd.txt",ios::in)

으로 바꿔봤더니..되더군요..

참고로 Visual Studio2005 를 사용했습니다.

유니코드 어쩌고 저쩌고 할때는 언제고.. 정작 파일명은 읽어오지를 못하나 봅니다.

근데 제 기억으로는 한글 파일명도 잘 읽어왔던 것으로 기억이 되는데.....

여하튼 한글보다는 영어로 써야겠습니다!!!


파일명은 항상 영어로 하는 습관을 키웁시다!!
(File name is must be english!!!!)  영어 공부중이라..-_-..맞는지 몰겠네요 ㅋㅋ