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 的单元号通常由编译器预先连接到标准输入、标准输出、标准错误和可能的其他文件。