자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
C++ Builder 텍스트화일 입출력 문제
2016.04.11 09:25
텍스트 화일 입출력과 관련해서 모호한 부분이 있어 이렇게 문의를 드립니다.
예전의 일반적인 char type에 대한 입출력이 최근 버젼의 OS에서 적용이 안되는 문제로 인해 최근 XE에서는 standard로 UnicodeString을 사용하는 것으로 알고 있습니다.
문제는 UnicodeString을 사용하면서 text 화일의 입출력에 대한 지원이 모호하다는 점입니다.
기존의 printf나 sprintf와 같은 format 기능을 활용한 입출력은 문제가 있는 것 같구요.
아래 몇가지 질문을 드립니다.
1. 현재는 주로 TStringlist, TMemo와 같은 것을 사용하게 되는데 최대 용량에 대한 부분이 어떻게 되는 지 알고 싶습니다. 인터넷에 보면 2Gb까지 가능하다고 되어 있는데 실제 해보면 한참 부족하구요. 정확한 최대 용량이나 또는 용량을 조정하는 법이 있는 지 조언을 주시면 감사하겠습니다.
2. fstream, ofstream, ifstream등의 방법을 사용을 할 수는 있겠지만 unicodestring에 대한 부분은 어떻게 되는 지 이에 대해 조언을 주시면 감사하겠습니다.
3 TFileStream을 사용시 용량 제한은 없어지는데 텍스트나 csv 형태로 저장할수 있는 방법이 있는지요? Format기능을 이용하여 출력이 아닌 입력시에 활용하는 방법이 있는지요?
감사드립니다.
댓글 2
-
험프리
2016.04.11 16:43
-
한시민
2016.04.12 07:36
여러가지 정보 감사드립니다. 실제 뭘 사용하는 지 알 수 있게되어 많은 도움이 되었습니다.^^
현재 이 부분에 대해 두 가지 문의가 있습니다.
TStringList의 경우 다음과 같이 테스트를 해보았는데 실제 라인 수가 2Gb에 한참 못미치더군요.
for(int i=0;i<10000;i++)
for(int j=0;j<10000;j++)
MyStringList->Add(IntToStr(i)+IntToStr(j));
메모리 부족을 표시하면서 대략 13,000,000정도에서 멈춤니다. 이것 때문에 TMemo를 테스트 해보았는데 디스크 입출력이 없음에도 속도가 훨씬 느리구요, 용량문제로 디스크에 TFIleStream을 이용하여 직접 쓰는데 역시 속도가 문제가 되더군요. TStringList와 같이 메모리에 직접 쓰고 나중에 한꺼번에 저장하는 것보다 속도가 너무 느려서 빠른 데이터저장이 요구될 때 문제가 될 가능성이 높습니다.
예전의 화일입출력 루틴들 (fprintf류들)도 느린 속도때문에 일단 TMemo를 사용을 하고 있습니다.
TSringList의 최대 용량 부분만 확실하게 해결되면 이걸 쓰면 좋을 것 같은데 이에 대해 조언을 해주실 수 있으면 감사드리겠습니다.
C++ Builder 텍스트화일 입출력 문제
2016.04.11 09:25
텍스트 화일 입출력과 관련해서 모호한 부분이 있어 이렇게 문의를 드립니다.
예전의 일반적인 char type에 대한 입출력이 최근 버젼의 OS에서 적용이 안되는 문제로 인해 최근 XE에서는 standard로 UnicodeString을 사용하는 것으로 알고 있습니다.
문제는 UnicodeString을 사용하면서 text 화일의 입출력에 대한 지원이 모호하다는 점입니다.
기존의 printf나 sprintf와 같은 format 기능을 활용한 입출력은 문제가 있는 것 같구요.
아래 몇가지 질문을 드립니다.
1. 현재는 주로 TStringlist, TMemo와 같은 것을 사용하게 되는데 최대 용량에 대한 부분이 어떻게 되는 지 알고 싶습니다. 인터넷에 보면 2Gb까지 가능하다고 되어 있는데 실제 해보면 한참 부족하구요. 정확한 최대 용량이나 또는 용량을 조정하는 법이 있는 지 조언을 주시면 감사하겠습니다.
2. fstream, ofstream, ifstream등의 방법을 사용을 할 수는 있겠지만 unicodestring에 대한 부분은 어떻게 되는 지 이에 대해 조언을 주시면 감사하겠습니다.
3 TFileStream을 사용시 용량 제한은 없어지는데 텍스트나 csv 형태로 저장할수 있는 방법이 있는지요? Format기능을 이용하여 출력이 아닌 입력시에 활용하는 방법이 있는지요?
감사드립니다.
댓글 2
-
험프리
2016.04.11 16:43
-
한시민
2016.04.12 07:36
여러가지 정보 감사드립니다. 실제 뭘 사용하는 지 알 수 있게되어 많은 도움이 되었습니다.^^
현재 이 부분에 대해 두 가지 문의가 있습니다.
TStringList의 경우 다음과 같이 테스트를 해보았는데 실제 라인 수가 2Gb에 한참 못미치더군요.
for(int i=0;i<10000;i++)
for(int j=0;j<10000;j++)
MyStringList->Add(IntToStr(i)+IntToStr(j));
메모리 부족을 표시하면서 대략 13,000,000정도에서 멈춤니다. 이것 때문에 TMemo를 테스트 해보았는데 디스크 입출력이 없음에도 속도가 훨씬 느리구요, 용량문제로 디스크에 TFIleStream을 이용하여 직접 쓰는데 역시 속도가 문제가 되더군요. TStringList와 같이 메모리에 직접 쓰고 나중에 한꺼번에 저장하는 것보다 속도가 너무 느려서 빠른 데이터저장이 요구될 때 문제가 될 가능성이 높습니다.
예전의 화일입출력 루틴들 (fprintf류들)도 느린 속도때문에 일단 TMemo를 사용을 하고 있습니다.
TSringList의 최대 용량 부분만 확실하게 해결되면 이걸 쓰면 좋을 것 같은데 이에 대해 조언을 해주실 수 있으면 감사드리겠습니다.
제가 오전에 답변을 드렸는데 이상하게 답변이 없어졌네요^^(날짜가 바뀐걸 보니 지우시고 다시 등록하신 것 같습니다.)
간단하게 다시 답변 드립니다.
1, 사양(Spec) 등은 공식 기술문서를 참고해 보세요.
http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Classes.TStringList
위 페이지 하단에 보시면 TStringList는 2,147,483,647(2G)개의 문자열(string)을 갖을 수 있다고 합니다.(글자갯수가 아니라 문자열 갯수입니다.)
Index가 Integer로 선언되어 2G개로 문자열이 제한 됩니다.
그리고 문자열(string)은 4바이트~2GB(2^30 자)까지 입력할 수 있습니다.
http://docwiki.embarcadero.com/RADStudio/Seattle/en/String_Types_(Delphi)
참고로 TStringList를 저장/불러오기 시 인코딩을 설정하지 않으면 ASCII로 읽어 옵니 주의하시기 바랍니다.
http://docwiki.embarcadero.com/CodeExamples/Seattle/en/TStringsEncoding_(Delphi)
2, (몇개의 생소한 스트림을 적어주셨는데요.)모든 스트림은 메모리를 다루는 개체입니다. TStringStream을 제외하고는 문자열을 직접적으로 다루지 않습니다. TStringStream은 string으로 데이터를 쓰거나 읽기 때문에 2009 버전 이상에서는 유니코드로 동작합니다.
3, TStringStream을 참고하세요.
또는 직접 파일을 다룰 수 있습니다.
http://www.delphibasics.co.uk/Article.asp?Name=Files
마지막으로 메모장 등의 텍스트 에디터에서 작성한 텍스트파일을 읽을때 문제가 되는 경우 저장 시 인코딩을 유니코드로 저장하는 것도 확인하시기 바랍니다.