2012-03-26 22 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の内容を言って読みたいです。 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:をキャッチされていません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; 

例外。なにが問題ですか?

上記のコードは単なるコードです。私は後で2列目の値を格納しないことにして、

+0

@Keith Thompson私は1つの列でファイルを読むことができます。 'Skip_Line'を使ってヘッダを無視することができます。私は 'Set_col'プロシージャをどのように使うべきかわかりませんが、これはカラム番号に行くのが正しい方法だと思っています。次に、 'Set_Col'の使い方を知らず、2つのカラムを読み込ませるようにします。私は、 'Set_Col'を列' 1'から '3'までそれぞれの行について扱うべきでしょうか? – yCalleecharan

答えて

2

"先頭の空白、行終端子、またはページ終端子をスキップします。"ヘッダーをスキップしたら、End_Of_Fileがtrueになるまで読書を続けてください。 Getを3つのグループに分けてコールし、中間の値を破棄します。

補足:多くの詳細は目標に依存します。この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)'という行をどこに置くべきですか?私は確かにそれを 'End_Of_File(Input_File)ではないwhile'ループに入れることはできません。 1票アップ。 – yCalleecharan

+0

ループが始まる前に 'Skip_Line'を呼び出してください。私は、通常、各グループの後に、この場合は3つの 'End_of_File'をチェックします。 'Data_Error'をキャッチすることを忘れないでください。私はあなたにこれを少し残しておきたいと思います。私の用法はちょっとステレオタイプで、もっと良い方法があるかもしれません。 – trashgod

関連する問題