关于将String变量写入文件有一些问题 . 问题是我必须指定该String的确切长度 . 否则输出文件将只包含一些废料值 . 我想知道这是否可以以某种方式解决,而无需事先告诉String的长度?
我知道我的 Get()
过程存储了该变量的长度,我只能将它返回给主程序 . 但是我想编写我的程序,所以它会在我开始写入out文件之前先从输入文件中读取所有内容 .
with Ada.Text_Io, Ada.Integer_Text_Io;
use Ada.Text_Io,Ada.Integer_Text_Io;
procedure Uppgift is
type Bil_Register is
record
Namn : String(1..50);
Adress : String(1..50);
Post : String(1..50);
Reg : String(1..6);
end record;
Infil : File_Type;
Utfil : File_Type;
L, I : Integer;
Br : Bil_Register;
procedure Get(F : in out File_Type; Br : out Bil_Register) is
Length : Integer;
begin
Get_Line(F, Br.Namn, Length);
end;
begin
Open(Infil, In_File, "register.txt");
Create(Utfil, Out_File, "test.txt");
Get(Infil, Br);
Put_Line(Utfil, Br.Namn);
Close(Infil);
Close(Utfil);
end Uppgift;
EDIT (2011.08.20)
这似乎只是基于Unix的操作系统的一个问题 . 使用Windows时,将其打印到文件或屏幕时,不必绝对是字符串大小
3 回答
好吧,必须在某处跟踪字符串有效部分的长度 .
您可以将每个记录的字符串字段的有效长度保持为单独的字段:
您可以定义自己的变量字符串类型包,也可以使用预先存在的变量字符串类型包,例如Variable_Length . 例如 .
您可以对字段和变量使用Unbounded_String:
和Ada.Text_IO.Unbounded_IO用于I / O:
如果您不想使用Unbounded_IO包,请使用To_String和To_Unbounded_String在Unbounded_String值和通过Text_IO读取和写入的字符串之间来回转换 .
我个人只是按照Marc C的建议使用Unbounded_String,但是如果你想避免这种情况,你可以这样做:
我将读写分为两个块,因为你说:
显然,使用此方法,您将必须适当地调整Buffer变量的大小 . 但实际上,与仅使用Unbounded_String相比,它非常笨拙 . 我会说,除非你有一些非常具体的问题或要求,否则Unbounded_String可能就是这样 . 它会极大地简化事情 .
祝好运! :O)
一般来说,你可以逃脱,而不必在Ada中有一个特殊的“长度”变量 . 可悲的是,这种情况很难实现 .
但是有一个技巧可以让你在这种情况下做到这一点 . 如果你不希望你的琴弦长得太长,或者你的琴弦会很慢 . 如果这听起来不错,请尝试Carlisle's trick .
现在您可以将代码更改为: