【问题标题】:Fortran character(:), dimension(:) vs character, dimension(:,:)Fortran 字符(:),维度(:) 与字符,维度(:,:)
【发布时间】:2021-03-15 20:16:07
【问题描述】:

我试图将文件的内容复制到字符串数组,但无法完全复制文件(它只是复制每行中的第一个字符)。我觉得我的语法有问题,可以用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 级字符数组,但第二个示例中的数组是什么?也许它们都是相同类型的数组,而我的第一个索引错误。有人可以澄清一下吗?

【问题讨论】:

  • 第一个 sn-p 不是有效的 Fortran,除非 line_countline_length 具有 allocatable 属性。最好在 “我记得” 半个版本上给出完整的独立示例。
  • @evets 我不知道它们是否相关,我已经为两者添加了整个代码。它们是不可分配的整数。你说它无效,但程序运行了,只是不是我想要的方式。
  • “这不起作用”实际上是什么意思?这句话没有说任何有用的东西。是否有任何错误信息?还是程序做错了什么?究竟是什么?
  • 在第二个示例中,您有一个字符串数组stackoverflow.com/questions/33415590/…
  • @VladimirF 我的意思是它没有给出我预期的结果,我写了“它只是复制每一行中的第一个字符”,这是第一个示例。

标签: fortran fortran90


【解决方案1】:

在第一个示例中,您有一个由单个字符组成的二维数组,字符串大小为 1。在另一个示例中,您有一个由较长字符串组成的一维数组。请参阅Difference between "character*10 :: a" and "character :: a(10)" 了解区别。

readstatement 将 2D 数组中的每个字符视为它尝试读取的单独变量。这就是为什么它似乎每次只存储第一个字符。您使用的列表导向格式* 不足以读取字符数组。

你实际上可以将一行读入一个字符数组,但你必须将它作为一个数组来读取并使用适当的格式

 read(1, '(*(a))') str(i,:)

您有责任确保文件的每一行中有足够的三个字符用于您的数组。

打印未显示的内容时也必须小心。

请注意,对您的文件使用单位 1 的格式很差。低于 10 的单元号通常由编译器预先连接到标准输入、标准输出、标准错误和可能的其他文件。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2022-01-03
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多