|
박지훈.임프 님이 쓰신 글 :
: 모름이 님이 쓰신 글 :
: : 구조체에 저장된 데이터를 파일(*.txt)로 저장하고
: : 그 파일을 읽어 데이터를 다시 구조체에 저장하는 프로그램을 구성하려고 합니다.
: : 데이터를 저장하면 아스키문자가 파일로 저장됩니다.
: : visual C에서는 그대로 입력되었던 것같은데, 뭔가 더 추가해야 할 사항이 있는지...
: : 예제를 올리겠습니다.
: : ////////////////////////////////////////////////////////////////////////////////////////
: : void __fastcall TForm1::Button1Click(TObject *Sender) //파일로부터 읽기 버튼입니다.
: : {
: : AnsiString temp_filename;
: : int iFileHandle;
: : int iFileLen;
: :
: : temp_filename=Edit1->Text;
: : if(!FileExists(temp_filename))
: : { //file create
: : iFileHandle=FileCreate(temp_filename);
: : Memo1->Lines->Add("파일이 생성됨.");
: : }
: : else
: : { //file에 있는 데이터 loading
: : iFileHandle=FileOpen(temp_filename,fmOpenReadWrite);
: : iFileLen=FileSeek(iFileHandle,0,2);
: : FileSeek(iFileHandle,0,0);
: : FileRead(iFileHandle,&G_DATA,iFileLen);<=======G_DATA를 찍어보면 이상한 문자가 있습니다.
: : FileClose(iFileHandle);
: : Memo1->Lines->Add(G_DATA.m_data1);
: : Memo1->Lines->Add(G_DATA.m_data2);
: : }
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::Button2Click(TObject *Sender) //파일에 쓰기 버튼입니다.
: : {
: : AnsiString filename;
: : int iFileHandle;
: : int iLen;
: : filename=Edit1->Text;
: :
: : iFileHandle=FileCreate(filename);
: : G_DATA.m_data1=Edit2->Text;
: : G_DATA.m_data2=Edit3->Text;
: : FileWrite(iFileHandle,&G_DATA,sizeof(G_DATA));
: :
: : FileClose(iFileHandle);
: : }
: :
: : ===> 다시 해보니, 문자열 빼고는 모두 적용이 됩니다.
: : 데이터를 문자열로 하면(AnsiString), 엉뚱한 값이 나오네요.-_-
: : 방법을 부탁드립니다.
: :
:
:
: 임펠리테리입니다.
:
: 안시스트링은 문자열에 대한 래퍼 클래스이므로 클래스 객체를 그대로 파일로 쓰면 엉뚱한 값이 들어갑니다. 안시스트링 외에 기본적인 타입들은 안그렇지요. 설명하신 내용으로 봐서는 비주얼C++에서 했던 방법에서는 스트링을 CString이 아닌 char * 를 쓰셨던 것 같습니다. 빌더에서도 char * 를 쓰시면 똑같이 됩니다. 단, 구조체 내의 char * 타입 변수도 메모리 할당을 해줘야 하지요.
:
: 그럼 참고하시길..
===============================================================================
예, 멤버 변수(m_data1)을 char*로도 선언을 했습니다. 문제는 "G_DATA.m_data1=Edit1->Text.c_str()"이렇게 해주어도 엉뚱한 값이 들어갑니다.
|