|
우시관 님이 쓰신 글 :
: 안녕하세요... 항상 이렇게 도움만 받고 있으니...
: 나두 언젠간 도움을 줄 수 있으리라 생각하며...
:
: 화일 입,출력 문제입니다.
: 빌더에서 다음과 같이 [탭]으로 구분된 data가 있습니다.
:
: 0.01 9.999
: 0.02 9.996
: 0.03 9.991
: 0.04 9.984
: 0.05 9.975
: 0.06 9.964
: 0.07 9.951
: 0.08 9.936
: 0.09 9.919
: 0.1 9.9
: 0.11 9.879
: ......
VCL의 파일 입출력 함수인 FileRead(), FileWrite() 함수는
필드 폭이 정확히 고정된 경우이거나, 바이너리 파일 입출력에 알맞습니다.
아래와 같은 Formatted Text Input/Output은
ANSI C/C++의 스트림 라이브러리를 쓰시는 것이 훨씬 편리합니다.
(물론 FileRead()와 FileWrite()의 기능도 커버할 수 있습니다.
그래서 저는 VCL의 파일 입출력 함수는 거의 쓰지 않습니다.)
여기서부터는 ANSI C++ 스트림 라이브러리로 설명하겠습니다.
: 두개를 double x[], double y[] 변수로 읽어 들이고 싶은데 어떻게 해야 되나요...???
ANSI C++에서는 배열을 대체하는 vector나 deque 컨테이너를 제공합니다.
vector를 사용한 코드를 써보겠습니다.
vector<double> vx, vy;
double dblx, dbly;
if (Form1->OpenDialog1->Execute()){
ifstream inFile(Form1->OpenDialog1->FileName.c_str()); // c_str()은 AnsiString을 char* 로 변환
if (!inFile) // 에러 검사 방법
ShowMessage("File Open Error!");
else {
while (inFile >> dblx >> dbly) { // 입력 끝이거나 잘못된 입력일 때 종료
vx.push_back(dblx); vy.push_back(dbly);
}
inFile.close(); // 이 라인은 굳이 안써도 됩니다.
// inFile이 스코프를 벗어날 때, ifstream의 소멸자에서 자동으로 파일을 닫습니다.
}
}
vx와 vy 벡터의 내용을
Memo1으로 출력하려면 다음과 같이 쓰면 됩니다.
Memo1->Clear();
for (size_t i = 0; i < vx.size(); i++) // size_t는 unsigned int => warning을 피하기 위함.
Memo1->Lines->Add(FloatToStr(vx[i]) + "\t" + FloatToStr(vy[i])); // operator[]를 사용
: data의 길이가 모두 똑같을 경우 구조체를 사용해도 될 것은 같은데...
: 데이타의 비트 수도 조금씩 다르고...
: 그냥 basic 이나 포트란 같이 변수에 하나씩 받아 들이는 방법은 없을가요???
:
: FileRead 함수를 사용해서 한번에 2개씩 x[],y[]에 읽으려면 어떻게 해야 되는지요...
: 아니면 다른 함수가 있는지요...???
:
: 고수님들 부탁드립니다.
|