Ada:读取文件问题
Ada: Reading From File Issue
所以我必须从文本文件中读取关系以对它们执行拓扑排序。问题是关系中的数据是异构的。大约有 3 种不同的枚举数据类型,其中还有整数和浮点数。从文件中读取此数据时,根据我的理解,它被读取并存储为字符串,直到您执行 Unchecked_Conversion。最终我的问题是,如果我要读取任意混合这些类型的任何文本文件,我是否需要在转换之前扫描我遇到的每个文件以查看它是什么类型?比如,我是否必须扫描每个元素检查句点“.”,以确定是将其转换为整数还是浮点数?谢谢!
更新:
每个文件中的数据都是由我生成的纯文本,而不是另一个程序。至于结构和顺序,我将展示我必须处理的数据集,然后解释我打算如何将它们放入文件中。所以这是我需要处理的数据集(每个都在一个单独的文件中):
Mary < Tom, Tom < Bob, Tom < Sam, Joe < Sam, Sam < Betty, and Mary < Sam, Bob < Betty, Joe < Betty
1<2, 1<3, 2<3, 4<1, 3<8, 8<9, 8<2, 4<2, 4<5, 6<4, 5<7, 2<7, 7<9, 9<8, 9<6, 2<7, 4<2, 9<8
(Ford, 2) < (Apple, 30.0), (Joe, sorcerer) < (orange, 56.2), (apple, 30.0) < (banana, 45.0), ... , (Bennett, warrior) < (Ford, 2)
这些是 3 个基本的:名称字符串、整数和对象。有 3 个不同的对象:CAR(type, numDoors)、FOOD(type, numCalories)、PERSON(name, class)。我计划将所有信息逐行依次放入文件中。这样,我可以两两处理每一行,因为关系是成对出现的。但是对于对象,每 4 行将是一个关系,我需要成对收集每一行以初始化对象的字段。 (上次我说关系是混合类型的。这是我的错误,因为我不明白有些数据是对象字段。)这样做时,我需要实例化一个传递文件名的通用类正在阅读和处理。对于字符串和整数,我可以只保留读取的字符串,并使用 'Value 属性将整数转换为整数。我的问题是对象。你认为我应该如何阅读它们并转换信息?我是否需要扫描每一个以查看它属于 3 个中的哪个对象?谢谢
使用 Unchecked_Conversion
很少是从 String
转换的好主意。您通常会为此使用 'Value
属性。
假设对象的名称唯一标识它们的类型,例如Banana
始终是 Fruit
而不是命名一种心态或其他任何东西,例如,然后在输入行的适当部分使用 'Value
。然后,或者,您 可以 也使用暴力和 Ada.Text_IO
包:只要文本 "BANANA" 可以传递给 Enumeration_IO.Get
的实例Fruit
,生成类型为 Fruit
的值,就这样。 (请注意 '<'
等也可以成为枚举类型的文字,这样您就可以使用相同的方法来读取排序。)
不过!您可能真的需要一个解析器或类似的东西; I/O 的非标准语法文本从来都不是完全微不足道的。例如。从其中一个模式匹配库(例如正则表达式)开始,以隔离文本的各个部分。另一种查找文件部分的方法——因为你知道它们——是使用 Ada.Strings.Fixed
.
中的字符串搜索例程
但是,如果您将文件的语法更改为广泛支持的语法之一,例如 JSON、XML、Graphviz 符号……那么合适的库将可用。流行语包括 "serialisation" 或 "marshalling".
<pair type="name">
<first>Tom</first>
<second>Sam</second>
</pair>
JSON 会更短,因为如果需要,您可以删除 and/or 类型信息的自描述标签 XML。
所以我必须从文本文件中读取关系以对它们执行拓扑排序。问题是关系中的数据是异构的。大约有 3 种不同的枚举数据类型,其中还有整数和浮点数。从文件中读取此数据时,根据我的理解,它被读取并存储为字符串,直到您执行 Unchecked_Conversion。最终我的问题是,如果我要读取任意混合这些类型的任何文本文件,我是否需要在转换之前扫描我遇到的每个文件以查看它是什么类型?比如,我是否必须扫描每个元素检查句点“.”,以确定是将其转换为整数还是浮点数?谢谢!
更新: 每个文件中的数据都是由我生成的纯文本,而不是另一个程序。至于结构和顺序,我将展示我必须处理的数据集,然后解释我打算如何将它们放入文件中。所以这是我需要处理的数据集(每个都在一个单独的文件中):
Mary < Tom, Tom < Bob, Tom < Sam, Joe < Sam, Sam < Betty, and Mary < Sam, Bob < Betty, Joe < Betty
1<2, 1<3, 2<3, 4<1, 3<8, 8<9, 8<2, 4<2, 4<5, 6<4, 5<7, 2<7, 7<9, 9<8, 9<6, 2<7, 4<2, 9<8
(Ford, 2) < (Apple, 30.0), (Joe, sorcerer) < (orange, 56.2), (apple, 30.0) < (banana, 45.0), ... , (Bennett, warrior) < (Ford, 2)
这些是 3 个基本的:名称字符串、整数和对象。有 3 个不同的对象:CAR(type, numDoors)、FOOD(type, numCalories)、PERSON(name, class)。我计划将所有信息逐行依次放入文件中。这样,我可以两两处理每一行,因为关系是成对出现的。但是对于对象,每 4 行将是一个关系,我需要成对收集每一行以初始化对象的字段。 (上次我说关系是混合类型的。这是我的错误,因为我不明白有些数据是对象字段。)这样做时,我需要实例化一个传递文件名的通用类正在阅读和处理。对于字符串和整数,我可以只保留读取的字符串,并使用 'Value 属性将整数转换为整数。我的问题是对象。你认为我应该如何阅读它们并转换信息?我是否需要扫描每一个以查看它属于 3 个中的哪个对象?谢谢
使用 Unchecked_Conversion
很少是从 String
转换的好主意。您通常会为此使用 'Value
属性。
假设对象的名称唯一标识它们的类型,例如Banana
始终是 Fruit
而不是命名一种心态或其他任何东西,例如,然后在输入行的适当部分使用 'Value
。然后,或者,您 可以 也使用暴力和 Ada.Text_IO
包:只要文本 "BANANA" 可以传递给 Enumeration_IO.Get
的实例Fruit
,生成类型为 Fruit
的值,就这样。 (请注意 '<'
等也可以成为枚举类型的文字,这样您就可以使用相同的方法来读取排序。)
不过!您可能真的需要一个解析器或类似的东西; I/O 的非标准语法文本从来都不是完全微不足道的。例如。从其中一个模式匹配库(例如正则表达式)开始,以隔离文本的各个部分。另一种查找文件部分的方法——因为你知道它们——是使用 Ada.Strings.Fixed
.
但是,如果您将文件的语法更改为广泛支持的语法之一,例如 JSON、XML、Graphviz 符号……那么合适的库将可用。流行语包括 "serialisation" 或 "marshalling".
<pair type="name">
<first>Tom</first>
<second>Sam</second>
</pair>
JSON 会更短,因为如果需要,您可以删除 and/or 类型信息的自描述标签 XML。