2012-03-26 4 views
1

나는 다음 내용을 텍스트 파일 fx.txt의 처음 몇 줄을 가지고파일의 특정 열을 읽는 방법?

t(ms) ForceX(N) ForceY(N) 
0.0  10.0  20.0 
1.0  15.0  10.9 
2.0  12.0  30.0 

나는 first column의와 third column의 내용을 말하고 읽고 싶습니다. 어떻게 에이다에 갈거야?

업데이트

여기 내 업데이트 된 코드는 다음과 같습니다

with Ada.Text_IO; use Ada.Text_IO; 
with Ada.Long_Float_Text_IO; 
with Ada.IO_Exceptions; 


procedure Get_Projections is 

    Input_File    : File_Type; 
    Value      : Long_Float; 


    procedure Open_Data_Read (File : in out Ada.Text_IO.File_Type; 
          Name : in String; 
          Success : out Boolean) is separate; 
    Success     : Boolean; 


begin 

    Open_Data_Read (File => Input_File, Name => "fx.txt", Success => Success); 
     if not Success then 
      return; 
     end if; 

    Ada.Text_IO.Skip_Line(File => Input_File, Spacing => 1); 

    while not End_Of_File (Input_File) loop 

    begin 
     Ada.Long_Float_Text_IO.Get (File => Input_File, Item => Value); 
     exception 
      when ADA.IO_EXCEPTIONS.DATA_ERROR => 
     Ada.Text_IO.Put_Line (" Data error"); 
    end; 
    Ada.Long_Float_Text_IO.Put (Item => Value, Fore => 3, Aft => 5, Exp => 0); 

    begin 
     Ada.Long_Float_Text_IO.Get (File => Input_File, Item => Value); 
     exception 
      when ADA.IO_EXCEPTIONS.DATA_ERROR => 
     Ada.Text_IO.Put_Line (" Data error"); 
    end; 
    Ada.Long_Float_Text_IO.Put (Item => Value, Fore => 3, Aft => 5, Exp => 0); 

    begin 
     Ada.Long_Float_Text_IO.Get (File => Input_File, Item => Value); 
     exception 
      when ADA.IO_EXCEPTIONS.DATA_ERROR => 
     Ada.Text_IO.Put_Line (" Data error"); 
    end; 
    Ada.Long_Float_Text_IO.Put (Item => Value, Fore => 3, Aft => 5, Exp => 0); 


    end loop; 
    Ada.Text_IO.Close (File => Input_File); 
    Ada.Text_IO.Put_Line (Item => "Reading file success: " & Boolean'Image (Success)); 


end Get_Projections; 

separateOpen_Data_Read.adb :를 잡은되지 data_error

separate (get_projections) 

procedure Open_Data_Read (File : in out Ada.Text_IO.File_Type; 
       Name : in String; Success : out Boolean) is 

    --this procedure prepares a file for reading 
    begin 
     Success := True; 
     begin 
     Ada.Text_IO.Open 
      (File => File, 
      Mode => Ada.Text_IO.In_File, 
      Name => Name); 
     exception 
     when Ada.Text_IO.Name_Error => 
     Success := False; 
     Ada.Text_IO.Put (File => Standard_Error, Item => "****File not found....****"); 
     Ada.Text_IO.Put_Line (Item => "Reading file success: " & Boolean'Image (Success)); 
    end; 
end Open_Data_Read; 

예외. 뭐가 잘못 되었 니?

위의 코드는 단순한 코드 일뿐입니다. 나중에 두 번째 열에 값을 저장하지 않기로 결정할 수 있습니다.

+0

@Keith Thompson 단일 열로 파일을 읽을 수 있습니다. 'Skip_Line'을 사용하여 헤더를 무시할 수 있습니다. 나는 이것이 열 번호로 가도록 요청하는 올바른 방법이라고 생각한다면'Set_col' 프로 시저를 어떻게 사용할 지 모른다. 그럼'Set_Col'을 어떻게 사용하는지 모르겠다. 각 행에 대해 'Set_Col' 열을'1' 열에서 '3' 열까지 바꿔야하나요? – yCalleecharan

답변

2

"선행 공백, 줄 종결 자 또는 페이지 종결자를 건너 뜁니다." 헤더를 건너 뛰면 End_Of_File이 참일 때까지 계속 읽으십시오. Get을 세 그룹으로 호출하고 가운데 값을 버립니다.

부록 : 많은 세부 사항은 목표에 따라 다릅니다. 이 sscce은 잘못 형성된 숫자를보고하는 동안 열 1과 3을 획득하려는 최소한의 시도입니다. 대안은 String으로 모든 것을 읽고 해당 버전의 Get을 사용하는 것입니다.

with Ada.Text_IO; 
with Ada.Float_Text_IO; 

procedure Get_Data is 

    package TIO renames Ada.Text_IO; 
    package FIO renames Ada.Float_Text_IO; 

    Data : TIO.File_Type; 
    Value : Float; 

begin 
    TIO.Open (Data, TIO.In_File, "data.txt"); 
    TIO.Skip_Line (Data); 
    while not TIO.End_Of_File (Data) loop 
     FIO.Get (Data, Value); 
     FIO.Put (Value, 3, 5, 0); TIO.Put (" "); 
     FIO.Get (Data, Value); -- Discard 
     FIO.Get (Data, Value); 
     FIO.Put (Value, 3, 5, 0); TIO.New_Line; 
    end loop; 
    exception 
     when TIO.End_Error => null; 
     when TIO.Data_Error => 
     TIO.Put_Line ("Data error: " & TIO.Name (Data)); 
end Get_Data; 
+1

실제로 'Ada.Text_IO.Float_IO'를 원하는 부동 소수점 유형으로 인스턴스화해야하지만'Ada.Float_Text_IO' 또는 'Ada.Long_Float_Text_IO'가 편리한 대안입니다. – trashgod

+0

이것은 작동합니다. 그러나'Ada.Text_IO.Skip_Line (1)'행을 어디에 넣어야합니까? 나는 그것을 while_Of_File (Input_File) 루프가 아닌 while 루프에 넣을 수는 없습니다. 1 표지지. – yCalleecharan

+0

루프가 시작되기 전에'Skip_Line'을 호출하십시오. 나는 일반적으로 각 그룹이 끝난 후 End_of_File을 체크한다.이 경우에는 3이다. 'Data_Error'를 잡는 것을 잊지 마십시오. 나는 너에게 이것을 조금 열어 두라고 충고한다. 내 사용법은 조금 틀에 박히고, 더 좋은 방법이있을 수 있습니다. – trashgod

관련 문제