Fortran 字符 (:)、维数 (:) 与字符、维数 (:,:)
Fortran character(:), dimension(:) vs character, dimension(:,:)
我试图将一个文件的内容复制到一个字符串数组,但我无法完全复制该文件(它只复制了每一行的第一个字符)。我觉得我的语法有问题,可以用 character, dimension(:,:)
来做,但它适用于 character(:), dimension(:)
.
这没有按预期工作:
character, allocatable :: list(:,:)
integer :: i, line_count, line_length
open(1, "input.txt", status="old", action="read")
line_count = count_file_lines(1) ! function that returns integer
line_length = longest_line_length(1) ! function that returns integer
allocate(list(line_count, line_length))
do i = 1, line_count
read(1, *) list(i,:)
end do
close(1)
这按预期工作:
character(:), allocatable :: list(:)
integer :: i, line_count, line_length
open(1, "input.txt", status="old", action="read")
line_count = count_file_lines(1) ! function that returns integer
line_length = longest_line_length(1) ! function that returns integer
allocate(character(line_length) :: list(line_count))
do i = 1, line_count
read(1, *) list(i)
end do
close(1)
我试过在第一个例子中切换索引,但还是不行。我知道第一个示例是 2 阶字符数组,但第二个示例中的数组是什么?也许它们都是同一类型的数组,而我对第一个数组的索引错误。有人可以澄清一下吗?
在第一个示例中,您有一个由单个字符组成的二维数组,字符串大小为 1。在另一个示例中,您有一个由较长字符串组成的一维数组。见 的区别。
read
语句将二维数组中的每个字符视为它尝试读取的单独变量。这就是为什么它看起来每次只存储第一个字符。您使用的列表导向格式 *
不足以读取字符数组。
您实际上可以将一行读入字符数组,但您必须将其作为数组读取并使用适当的格式
read(1, '(*(a))') str(i,:)
您有责任确保文件每一行中的三个字符足以用于数组。
打印内容时也必须小心,您没有显示。
请注意,对您的文件使用单位 1
是一种糟糕的形式。小于 10 的单元号通常由编译器预先连接到标准输入、标准输出、标准错误和可能的其他文件。
我试图将一个文件的内容复制到一个字符串数组,但我无法完全复制该文件(它只复制了每一行的第一个字符)。我觉得我的语法有问题,可以用 character, dimension(:,:)
来做,但它适用于 character(:), dimension(:)
.
这没有按预期工作:
character, allocatable :: list(:,:)
integer :: i, line_count, line_length
open(1, "input.txt", status="old", action="read")
line_count = count_file_lines(1) ! function that returns integer
line_length = longest_line_length(1) ! function that returns integer
allocate(list(line_count, line_length))
do i = 1, line_count
read(1, *) list(i,:)
end do
close(1)
这按预期工作:
character(:), allocatable :: list(:)
integer :: i, line_count, line_length
open(1, "input.txt", status="old", action="read")
line_count = count_file_lines(1) ! function that returns integer
line_length = longest_line_length(1) ! function that returns integer
allocate(character(line_length) :: list(line_count))
do i = 1, line_count
read(1, *) list(i)
end do
close(1)
我试过在第一个例子中切换索引,但还是不行。我知道第一个示例是 2 阶字符数组,但第二个示例中的数组是什么?也许它们都是同一类型的数组,而我对第一个数组的索引错误。有人可以澄清一下吗?
在第一个示例中,您有一个由单个字符组成的二维数组,字符串大小为 1。在另一个示例中,您有一个由较长字符串组成的一维数组。见
read
语句将二维数组中的每个字符视为它尝试读取的单独变量。这就是为什么它看起来每次只存储第一个字符。您使用的列表导向格式 *
不足以读取字符数组。
您实际上可以将一行读入字符数组,但您必须将其作为数组读取并使用适当的格式
read(1, '(*(a))') str(i,:)
您有责任确保文件每一行中的三个字符足以用于数组。
打印内容时也必须小心,您没有显示。
请注意,对您的文件使用单位 1
是一种糟糕的形式。小于 10 的单元号通常由编译器预先连接到标准输入、标准输出、标准错误和可能的其他文件。