Q&A

  • readln이 한 라인이 아니라 화일 전체를 읽는 이유?
안녕하세요

조금 황당하네요

아래와 같은 텍스트화일(수치모델 출력 화일)을 읽어서 특정 위치의 자료만을 골라서 다시 다른 텍스트 화일로 저장하고 싶어요

프로그램은 거의 완성을 하였는데

테스트과정에서 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. 어떻게 하면 한 라인씩 읽을 수 있는지?



도와주세요.

읽어주셔서 감사합니다.

그럼 즐푸되세요.





5  COMMENTS
  • Profile
    심재용 2000.12.28 22:56
    첫번째방법>

    먼저 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;





  • Profile
    황광일 2000.12.11 10:42
    울트라 에디터에서

    메뉴를 살펴보면..UNIX->DOS 저장 비스무리한 메뉴가 있는데...

    그렇게 한다음

    테스트 함 해보실랍니까?



    김 길엽 wrote:

    > 안녕하세요

    > 조금 황당하네요

    > 아래와 같은 텍스트화일(수치모델 출력 화일)을 읽어서 특정 위치의 자료만을 골라서 다시 다른 텍스트 화일로 저장하고 싶어요

    > 프로그램은 거의 완성을 하였는데

    > 테스트과정에서 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. 어떻게 하면 한 라인씩 읽을 수 있는지?

    >

    > 도와주세요.

    > 읽어주셔서 감사합니다.

    > 그럼 즐푸되세요.

    >

    >

  • Profile
    김 길엽 2000.12.11 14:26
    답변 고맙습니다.



    그 방법은 이미 해보았어요

    워드패드에서 불러다가 저장한후에는 잘 됩니다.



    하지만 화일이 엄청 많아요

    1년치 대략 10000개(하루 4회 * 8개 * 30일 * 12개월) 정도...

    이 많은 화일을 무슨 수로 하나하나 불러다가 다시 저장하겠습니까?

    다시 한번 굽어 살피소서



    황광일 wrote:

    > 울트라 에디터에서

    > 메뉴를 살펴보면..UNIX->DOS 저장 비스무리한 메뉴가 있는데...

    > 그렇게 한다음

    > 테스트 함 해보실랍니까?

    >

    > 김 길엽 wrote:

    > > 안녕하세요

    > > 조금 황당하네요

    > > 아래와 같은 텍스트화일(수치모델 출력 화일)을 읽어서 특정 위치의 자료만을 골라서 다시 다른 텍스트 화일로 저장하고 싶어요

    > > 프로그램은 거의 완성을 하였는데

    > > 테스트과정에서 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. 어떻게 하면 한 라인씩 읽을 수 있는지?

    > >

    > > 도와주세요.

    > > 읽어주셔서 감사합니다.

    > > 그럼 즐푸되세요.

    > >

    > >

  • Profile
    컴맹... 2000.12.11 18:47
    안녕하십니까...

    컴맹이어여...

    Unix의 File system은 기본적으로 windows(dos)와는 다르죠...

    windows의라인의 끝에는 CR,LF가 동시에 나에게 되죠..

    하지만 Unix는 그런걸 표시하지 않습니다..

    따라서 ReadLn으로는 읽어 들이면 한라인으로 인식을 하죠..

    ReadLn으로 하지 마시구여..

    Read로 gks한문자씩읽어 '#$A'로 한라인으로 하면 될것같은데여...

    그럼 이만...



    김 길엽 wrote:

    > 답변 고맙습니다.

    >

    > 그 방법은 이미 해보았어요

    > 워드패드에서 불러다가 저장한후에는 잘 됩니다.

    >

    > 하지만 화일이 엄청 많아요

    > 1년치 대략 10000개(하루 4회 * 8개 * 30일 * 12개월) 정도...

    > 이 많은 화일을 무슨 수로 하나하나 불러다가 다시 저장하겠습니까?

    > 다시 한번 굽어 살피소서

    >

    > 황광일 wrote:

    > > 울트라 에디터에서

    > > 메뉴를 살펴보면..UNIX->DOS 저장 비스무리한 메뉴가 있는데...

    > > 그렇게 한다음

    > > 테스트 함 해보실랍니까?

    > >

    > > 김 길엽 wrote:

    > > > 안녕하세요

    > > > 조금 황당하네요

    > > > 아래와 같은 텍스트화일(수치모델 출력 화일)을 읽어서 특정 위치의 자료만을 골라서 다시 다른 텍스트 화일로 저장하고 싶어요

    > > > 프로그램은 거의 완성을 하였는데

    > > > 테스트과정에서 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. 어떻게 하면 한 라인씩 읽을 수 있는지?

    > > >

    > > > 도와주세요.

    > > > 읽어주셔서 감사합니다.

    > > > 그럼 즐푸되세요.

    > > >

    > > >

  • Profile
    김길엽 2000.12.13 04:33
    감사합니다.



    read로도 읽어보았어요

    '#$A'가 텍스트화일에는 없고 readln으로 읽었을 때 변수에 할당될 때 라인의 끝에 해당되는 부분에 첨가가 되어요

    read로 읽으면 '#$A'부분을 건너뛰고 다음 문자를 읽어요

    어떻게 하면 될까요

    다시 한번 답변 기다릴께요

    그럼 부탁해요





    컴맹... wrote:

    > 안녕하십니까...

    > 컴맹이어여...

    > Unix의 File system은 기본적으로 windows(dos)와는 다르죠...

    > windows의라인의 끝에는 CR,LF가 동시에 나에게 되죠..

    > 하지만 Unix는 그런걸 표시하지 않습니다..

    > 따라서 ReadLn으로는 읽어 들이면 한라인으로 인식을 하죠..

    > ReadLn으로 하지 마시구여..

    > Read로 gks한문자씩읽어 '#$A'로 한라인으로 하면 될것같은데여...

    > 그럼 이만...

    >

    > 김 길엽 wrote:

    > > 답변 고맙습니다.

    > >

    > > 그 방법은 이미 해보았어요

    > > 워드패드에서 불러다가 저장한후에는 잘 됩니다.

    > >

    > > 하지만 화일이 엄청 많아요

    > > 1년치 대략 10000개(하루 4회 * 8개 * 30일 * 12개월) 정도...

    > > 이 많은 화일을 무슨 수로 하나하나 불러다가 다시 저장하겠습니까?

    > > 다시 한번 굽어 살피소서

    > >

    > > 황광일 wrote:

    > > > 울트라 에디터에서

    > > > 메뉴를 살펴보면..UNIX->DOS 저장 비스무리한 메뉴가 있는데...

    > > > 그렇게 한다음

    > > > 테스트 함 해보실랍니까?

    > > >

    > > > 김 길엽 wrote:

    > > > > 안녕하세요

    > > > > 조금 황당하네요

    > > > > 아래와 같은 텍스트화일(수치모델 출력 화일)을 읽어서 특정 위치의 자료만을 골라서 다시 다른 텍스트 화일로 저장하고 싶어요

    > > > > 프로그램은 거의 완성을 하였는데

    > > > > 테스트과정에서 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. 어떻게 하면 한 라인씩 읽을 수 있는지?

    > > > >

    > > > > 도와주세요.

    > > > > 읽어주셔서 감사합니다.

    > > > > 그럼 즐푸되세요.

    > > > >

    > > > >