태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

원래 가장 뒤에 연속된 개행문자만 지우려고 했는데 그게 잘 안되더군요..

그래서 스트링 a에서 뒤부터 개행 문자를 찾고(rfind)  찾은 곳으로 부터 char 하나를 지웠습니다.(erase)

그런데 그 뒤에 개행문자를 찾는 지점과 문자열 a의 사이즈를 찍어봤더니...

a 사이즈 : 200
개행문자 찾은 지점 : 200

(위의 과정을 하번 겪은 후에)
a 사이즈 : 199
개행문자 찾은 지점 : 198
(위의 과정을 한번 더 겪은 후에)
a사이즈 : 198
개행문자 찾은 지점:197
.
.
.
.
이게 도대체 뭐하자는 건가...싶어서 곰곰히 생각을 해봤는데

리눅스에서 개행문자는 \r이라는 것이 생각이 나더군요..

뭐 아무튼 각설하고 아래 주석 보시면서 윈도우에서 리눅스로 넘어가면서 스트링을 바로 처리하셔야 할 때는 참고하세요~

(dos2unix를 쓰면 안되나요? --> 해봤는데.. 안됩니다.....이유는 잘 모르겠습니다..아무튼..좀 호환성이..참....애매 하네요 -_-).......)

     8 void delete_newline(string &a)
     9 {
     10     while(1)
     11     {
     12         int pos = a.rfind('\n'); //개행 문자 찾아서 pos로 변수 지정
     13         if(pos != -1 ) //찾는것이 있으면
     14         {
     15             a.erase(pos-1,2); //문자 2개를 지움, 이때 pos에서 2개가 아닌 pos-1에서 2개를 지움
                      //\r\n의 형식으로 되어 있기 때문에 뒤에 문자를 찾게 되겠죠? 그래서 그런듯 싶네요..
     16
     17         }
     18         else
     19             break;
     20     }
     21 }

오늘 오전 내내 이것만 하였군요..

그럼 다들 즐프 하세요 ~_~)~

일단 소스부터 보시겠습니다.
=====================================================================================
string load_memory(ifstream &infile)
{
        char *buff;
        int size;
        string dest;
 
        infile.seekg(0,ios::end);

        size = infile.tellg();

        infile.seekg(0,ios::beg);

        buff = new char[size];
        //memset(buff,0,size);
        infile.read(buff,size);
        cout<<buff<<endl;
 
        return dest;
}
====================================================================================
윈도우 VS2005에서 작성되었습니다.

infile을 인자로하여 열린파일의 내용을 메모리에 Load하는 함수입니다.

파일의 사이즈를 구하고 동적할당해서 메모리를 잡은다음에 파일의 크기만큼(즉, 전체를) 읽어오는 내용입니다.

이렇게 한 뒤에 buff를 출력해보면 파일의 내용이 전부다 출력되고 그 뒤에 이어서 한자와 같은 쓰레기 값이 출력이 됩니다.

이런 한자같은 쓰레기 값들은 보통 내용이 없는 메모리에 접근하였을 때 나타나는 증상입니다.

이럴 때는 '\0'값을 의심해봐야합니다.

그래서 저도 '\0'값을 열심히 찍어봤는데 원인을 찾지 못했습니다.

그래서 리눅스에서 저 소스 그대로 실행해봤더니 잘 돌아가더군요.

아무래도 운영체제나 컴파일러에 영향을 받는듯 보였습니다.

반드시 원인을 찾아내야 속이 시원한 제 성격상..리눅스에서 작업을 계속할수만은 없는 노릇입니다.

그래서 열심히 삽질을 했지만 이유를 찾지 못했죠.

그때 선배님의 조언으로 인해서(역시 경험이 풍부한 분들은 이런일도 먼저 겪어보신 경우가 많더군요)

memset 함수를 사용하여 초기화 시킨후에 하면 된다는 것을 알아냈습니다.

솔직히 파일 뒷부분에 쓰레기 값이 참조되는 이유와는 큰 상관은 없지만 그래도 이런식으로 하면

에러가 처리되니 괜찮은 방법인 것 같습니다.

아직도 이해가 안되는 것은...

왜 리눅스에서는 되고 윈도우에서는 안되는 것일까요.......어디 아시는분 없으신가요 ㅠ_ㅠ

간만에 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!!!!)  영어 공부중이라..-_-..맞는지 몰겠네요 ㅋㅋ

void main()
{
   char buff[256];
   ifstream in_file;
   in_file.open("test.txt",ios::in);
   while(1)
   {
      in_file>>buff;
      if(in_file.fail())
         break;
      cout<<buff<<endl;
   }
   in_file.close();
}

======================

저도 사실은 eof 나 peek를 사용해서 while문을 돌렸는데요.

이 때 사용되는 eof는 단순히 파일포인터가 끝을 향하고 있는지에 대해서 검사를 한다고 하는군요.

그리고 peek도 자주 사용을 하지만 fail을 사용하는 것이 가장 일반적이라고 하더군요 -0-);;

이유는..잘 모르겠습니다만..

아무래도 fail이 조금더 eof나 peek 보다 더 포괄적인 함수라서 그런 것 같습니다~

#include <fstream>

#include <string>

#include <iostream>

using namespace std;

void main()

{

  fstream fs,os;

   int i=0;

   long doc_size;

   char *doc;

   //doc 메모리할당

  fs.open("result.xml",ios::in);

  os.open("temp.xml",ios::out);

  fs.seekg(0,ios::end);

  doc_size = fs.tellg();

  fs.seekg(0,ios::beg);

  doc = new char[doc_size+1];

   //doc에파일한꺼번에올리기

  fs.read(doc,doc_size-1);

  doc[doc_size] = ''

  os << doc;

  /*while(1)

  {

      os<<doc[i];

      if(doc[i] == '')break;

         i++;

   }*/

  fs.close();

  os.close();

   delete []doc;

}

====================================================================

위의 주석대로 할때와 그 위의 밑줄 친 부분....확연히 비교해봐도 어느 것이 더 빠를것인지 짐작이 갈 것이다.

파일복사를 주 내용으로 보기에는 많이 미약하지만 메모리 동적할당을 하는데에 있어서 기본적인 뼈대를 보는대에는

크게 무리가 없을 것 같다.


본문내용 : http://shine-ing.ohpy.com/203468/1