如何将文本文件中的数据读入两个数组?一个是字符串,另一个是整数?
文本文件的布局如下:
Hello
1
Test
2
Bye
3
每个数字对应于它上面的文字。任何人都可以帮助我吗?非常感谢它
答案 0 :(得分:6)
var
Items: TStringList;
Strings: array of string;
Integers: array of Integer;
i, Count: Integer;
begin
Items := TStringList.Create;
try
Items.LoadFromFile('c:\YourFileName.txt');
// Production code should check that Items.Count is even at this point.
// Actual arrays here. Set their size once, because we know already.
// growing your arrays inside the iteration will cause many reallocations
// and memory fragmentation.
Count := Items.Count div 2;
SetLength(Strings, Count);
SetLength(Integers, Count);
for i := 0 to Count - 1 do
begin
Strings[i] := Items[i*2];
Integers[i] := StrToInt(Items[i*2+1]);
end;
finally
Items.Free;
end;
end
答案 1 :(得分:2)
我会将文件读入字符串列表,然后逐项处理。偶数列表放入字符串列表中,奇数列表放入数字中。
var
file, strings, numbers: TStringList;
...
//create the lists
file.LoadFromFile(filename);
Assert(file.Count mod 2=0);
for i := 0 to file.Count-1 do
if i mod 2=0 then
strings.Add(file[i])
else
numbers.Add(file[i]);
我可能会在自己的代码中使用一些名为odd
和even
的辅助函数。
如果你想要整数列表中的数字而不是字符串列表,那么你可以使用TList<Integer>
并在奇数迭代上添加StrToInt(file[i])
。
为了便于编写此代码,我使用了列表而不是动态数组,但GolezTrol向您展示了如何使用动态数组,如果这是您喜欢的。
那就是说,既然你的状态是这个数字与字符串相关联,你可能会更喜欢这样的事情:
type
TNameAndID = record
Name: string;
ID: Integer;
end;
var
List: TList<TNameAndID>;
Item: TNameAndID;
...
List := TList<TNameAndID>.Create;
file.LoadFromFile(filename);
Assert(file.Count mod 2=0);
for i := 0 to file.Count-1 do begin
if i mod 2=0 then begin
Item.Name := file[i];
end else begin
Item.ID := StrToInt(file[i]);
List.Add(Item);
end;
end;
end;
这种方法的优点是您现在可以保证名称和ID之间的关联将得到维护。如果你想要排序,插入或删除项目,你会发现上述结构比两个并行数组更方便。