2012-03-26 78 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 columnthird column的內容。 Ada怎麼去?

更新

這裏是我更新的代碼:

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

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; 

例外data_error沒有被卡住。哪裏不對?

注意上面只是一段粗略的代碼。我可以決定不在後面的第二列中存儲值

+0

@Keith Thompson我可以閱讀單列文件。我可以使用Skip_Line來忽略標題。我不知道如何使用'Set_col'過程,如果我相信這是要求轉到列號的正確方法。然後我不知道如何使用'Set_Col'並且仍然要讀取兩列。我是否應該爲每一行處理'1'列到'3'的'Set_Col'? – yCalleecharan 2012-03-26 17:33:44

回答

2

procedure Get「跳過任何前導空白,行結束符或頁面終止符。」一旦你跳過標題,只要繼續閱讀,直到End_Of_File爲真。以三個組的形式呼叫Get並丟棄中間值。

附錄:大部分細節取決於目標。此sscce是獲取第一列和第三列的最小嚐試,同時報告格式錯誤的數字。另一種方法是將所有內容都讀取爲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 2012-03-26 18:03:58

+0

這工作。但是在哪裏放行'Ada.Text_IO.Skip_Line(1)'?我當然不能把它放在'while End_Of_File(Input_File)'循環中。 1投票。 – yCalleecharan 2012-03-26 18:10:00

+0

循環開始之前調用'Skip_Line'。在這種情況下,我通常在每組之後檢查「End_of_File」。不要忘記抓住'Data_Error'。我希望你稍微打開一下;我的用法有點刻板,可能有更好的辦法。 – trashgod 2012-03-26 18:21:47

相關問題