2014-11-05 27 views
0

我在读取文件中的输入时遇到了一些麻烦。所以我所做的是做了一个概念验证程序,这是我的主要程序的一部分,它可以做更多的事情,但我只是在阅读输入时遇到困难。 这里是我的概念方案的论证:只读取来自ada文件的一个输入

WITH Ada.Text_IO; USE Ada.Text_IO; 
with ada.Integer_Text_IO; use ada.Integer_Text_IO; 
PROCEDURE Open_File IS 

subtype idnum is string(1 ..7); 
    -- Make short names so that we can show where things come from 

    My_File : File_Type;     -- Name for file in this program 
    Os_Name : String  := "My_Data.txt"; -- OS name for the file 
    N  : idnum;      -- Temporary for reading and printing file contents 
    EOL : boolean; 
    C : character; 
BEGIN 

    -- Open will raise an ADA.IO_EXCEPTIONS.NAME_ERROR expection 
    -- if the file does not exist. 

    Open (File => My_File, Mode => In_File, Name => Os_Name); 

    LOOP 
     EXIT WHEN End_Of_File (My_File); 

     Look_Ahead(My_File, C, EOL); 
     IF EOL THEN 
     Skip_Line; 
     ELSE 
     IF C = ' ' THEN 
      Get(My_File, C); 
     ELSE 
      Get (My_File, N); 
      Put_Line(N); 
     END IF; 
     END IF;   
    END LOOP; 

    Close (My_File); 
END open_file; 

我的数据文件看起来像这样:(包括最后的ID后,没有新的生产线的空间)

1234567 

     456784a 

    6758abc 

当我编译和运行我的程序只有第一个ID号码被打印到屏幕上。我不知道在哪里检查我的代码,因为它应该继续获取id号码直到文件结尾。

任何帮助将不胜感激。谢谢!

+0

如果遇到空行会发生什么? (同样,你有一个缺失END IF。) – 2014-11-05 22:25:02

+0

和'C'和'EOL'没有被定义在任何地方 – egilhh 2014-11-05 22:35:51

+0

我修正了“END IF;”部分,它仍然没有读取任何东西,但第一行。我改变了我的数据文件的顺序,在第一个id之前有一个空行,它仍然只读取第一个id。更新:也宣布EOL和C – EPKasper 2014-11-05 22:47:12

回答

1

当你Get第二(和第三,就此而言)行,将会引发Data_Error异常,因为456784a不是数字,'a'不是数字字符。如果你想要它是一个十六进制数字,输入应该是16#456784a#(默认情况下)。

+0

也在更新版本,而不是一个整数,我读它是一个子类型idnum这是一个字符串的长度为7.仍然有同样的问题,但。 – EPKasper 2014-11-05 22:50:27

+1

提示:您可以使用My_File调用Open,End_Of_File,Look_Ahead,Get和Close。你为什么文件跳过一行? – egilhh 2014-11-05 23:07:23

+0

啊是的,谢谢你我不知道skip_line的参数哇我不敢相信这是简单的东西。 – EPKasper 2014-11-05 23:12:09