안녕하세요
조금 황당하네요
아래와 같은 텍스트화일(수치모델 출력 화일)을 읽어서 특정 위치의 자료만을 골라서 다시 다른 텍스트 화일로 저장하고 싶어요
프로그램은 거의 완성을 하였는데
테스트과정에서 readln으로 한 라인을 읽었는데 원하는 데로 한 라인만 읽어오는 것이 아니라 화일의 모든 텍스트를 읽고 있읍니다.
텍스트화일의 내용 :
U SFC 10.0 55 61
-74 -74 -74 -73 -73 -73 -72 -72 -72 -71 -71 -71 -71 -70 -70
-69 -69 -69 -68 -68 -68 -68 -68 -68 -68 -68 -68 -68 -68 -68
-68 -68 -68 -67 -67 -67 -67 -67 -67 -67 -77 -76 -76 -76 -75
-73 -73 -72 -72 -72 -72 -71 -71 -71 -70 -70 -70 -70 -69 -69
.
.
.
readln(Fvar, imsi);
이러면 imsi의 값이
imsi := ' U SFC 10.0 55 61'가 되어야 하는데
화일의 모든 내용이 imsi의 값으로 들어갑니다.
imsi :=' U SFC 10.0 55 61'#$A' -74 -74 -74 -73 -73 -73 -72 -72 -72 -71 -71 -71 -71 -70 -70'#$A' -69 -69 -69 -68 -68 -68 -68 -68 -68 -68 -68 -68 -68 -68 -68'#$A' -68 -68 -68 -67 -67 -67 -67 -67 -67 -67 -77 -76 -76 -76 -75'#$A' -73 -73 -72 -72 -72 -72 -71 -71 -71 -70 -70 -70 -70 -69 -69'#$A' .....
참고로 위 텍스트 화일은 리눅스에서 운영되는 수치모델에서 나온 출력 화일입니다.
1. 왜 한 라인만 읽지 않고 전체를 읽는지?
2. '#$A'의 의미가 무엇인지?
3. 어떻게 하면 한 라인씩 읽을 수 있는지?
도와주세요.
읽어주셔서 감사합니다.
그럼 즐푸되세요.
먼저 RichEdit 를 사용해서 자료를 읽고난뒤에 변환하는 것은 이상이 없었다는 내용에 착안하여 RichEdit 콤포넌트를 분석?해서 다음과 같이 해결방법을 만들어 보았습니다.
요약>> 화일을 스트림 자료로 변환한다. -> 스트림 자료에서 특정코드부분을 적당히 제어한다. -> 결과값을 확인한다.
// 1.스트링을 원하는 방식으로 변환하는 프로시져
procedure SetTextStr(const Value: string);
var
P, Start: PChar;
S: string;
begin
P := Pointer(Value);
if P <> nil then
while P^ <> #0 do // 이 while블럭을 적당히 수정해서 쓰세여..
begin
Start := P;
while not (P^ in [#0, #10, #13]) do Inc(P); // 특정 코드를 필터하고 있슴.
SetString(S, Start, P - Start);
Add(S); <= RichEdit 상자에 넣는 부분.
if P^ = #13 then Inc(P); // #13 을 그냥 스킵하고 있군요.
if P^ = #10 then Inc(P); // #10 을 그냥 스킵하고 있군요.
end;
end;
// 2.스트림에서 읽어오는 프로시져
procedure LoadFromStream(Stream: TStream);
var
Size: Integer;
S: string;
begin
Size := Stream.Size - Stream.Position;
SetString(S, nil, Size);
Stream.Read(Pointer(S)^, Size); //
SetTextStr(S); // <= 1.스트링을 원하는 방식으로 변환하는 프로시져
end;
// 3.파일을 읽는 프로시져
procedure LoadFromFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream); // <= 2.스트림에서 읽어오는 프로시져
finally
Stream.Free;
end;
end;
두번째방법>>
Readln은 호환성에서 약간 부적절합니다. #0,#13,#10등을 문자열의 끝으로 인식한다던지..
BlockRead 와 BlockWrite를 사용하는 방법인데요.
이들은 화일로부터 n Byte를 무조건 읽어들일수 있습니다. nByte를 읽어서 필터하면 문제를 해결할 수 있겠져? 다음의 내용은 델파이Help에 있는 예제입니다.
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
if OpenDialog1.Execute then { Display Open dialog box }
begin
AssignFile(FromF, OpenDialog1.FileName);
Reset(FromF, 1); { Record size = 1 }
if SaveDialog1.Execute then { Display Save dialog box}
begin
AssignFile(ToF, SaveDialog1.FileName); { Open output file }
Rewrite(ToF, 1); { Record size = 1 }
Canvas.TextOut(10, 10, 'Copying ' + IntToStr(FileSize(FromF))
+ ' bytes...');
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
end;
end;
end;