Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File io `列表定向io语法错误`在Fortran中读取第一行中开始的CSV_File Io_Fortran_Intel Fortran - Fatal编程技术网

File io `列表定向io语法错误`在Fortran中读取第一行中开始的CSV

File io `列表定向io语法错误`在Fortran中读取第一行中开始的CSV,file-io,fortran,intel-fortran,File Io,Fortran,Intel Fortran,我需要从CSV文件中读取矩阵数据。这些数据都是数字,但可能没有固定格式。下面是一个名为Data.csv 1,2.1,3,4 2,3,4.2,5 3,4,5,6.33 4,5,6,7 5,6,7,8 6,7,8,9 7,8,9,10 8,9,10,11 我试了两件事。首先编写从CSV文件读取未格式化数据的子例程 program main implicit none integer,parameter :: dp = selected_real_kind(15, 307) integer,par

我需要从CSV文件中读取矩阵数据。这些数据都是数字,但可能没有固定格式。下面是一个名为
Data.csv

1,2.1,3,4
2,3,4.2,5
3,4,5,6.33
4,5,6,7
5,6,7,8
6,7,8,9
7,8,9,10
8,9,10,11
我试了两件事。首先编写从CSV文件读取未格式化数据的子例程

program main

implicit none
integer,parameter :: dp = selected_real_kind(15, 307)
integer,parameter :: N = 8
integer,parameter :: M = 4    
integer           :: i
real(dp)          :: yr(N,M)   

! Reading file using subroutine
call txtr_data_mat('Data.csv',yr)

contains    

subroutine txtr_data_mat(filename,rdata)
    character (len=*),intent(in) :: filename
    real(dp),intent(inout)       :: rdata(:,:)
    integer                      :: n1,n2,i1,i2
    character (60)               :: fnametxt
    fnametxt = trim(filename)
    n1 = size(rdata,1)
    n2 = size(rdata,2)
    open (12, file = fnametxt)
    read (12,*) ((rdata(i1,i2), i2=1,n2), i1=1,n1)
    close(12)
end subroutine txtr_data_mat
    
end program main
这给了我一个错误:
forrtl:severe(59):列表定向I/O语法错误,第12单元,文件C:\source\Data.csv
。我还尝试了一些更简单的方法。我没有使用上面的子程序,而是尝试:

open (17, file='Data.csv')
do i = 1,N
    read (17, *) yr(i,:)
end do
close(17)
这也会产生相同的错误:
forrtl:severe(59):列表定向I/O语法错误,第17单元,文件C:\source\Data.csv
。奇怪的是,当我读取一个“空白”行时,通过在
open
命令和循环开始之间添加
read(17,,())
,它似乎工作了一段时间,但是,当然,它跳过了第一行,所以它在没有完成的情况下到达了文件末尾(错误:
forrtl:severy(24):读取过程中文件结束,第17单元,文件C:\source\Data.csv


有没有办法解决这个问题?我试图使用一个子程序作为开始时的子程序,因为我需要对不同形状的矩阵重复相同的过程很多次。

如果文件是UTF-8编码的,您应该在OPEN语句中使用编码说明符通知编译器


考虑到UTF-8编码方案的Unicode规范,当前英特尔Fortran版本中可能存在一个编译器运行时错误,当它被告知编码时,仍然无法处理BOM标记。

对我来说很好(Linux上的gfortran 7.4)。我觉得不错。完全猜测-在最后一行的末尾是否有行尾字符?如果不尝试添加一个。顺便说一句,子例程中的修剪不会有多大效果,fnametxt的长度为60个字符,无论您做什么,如果需要,都会用空格填充。如果你想使用trim,如果你担心训练空格,最简单的地方就是open语句本身——这样你就可以得到文件名,而我在windowsx64上的ifort 19.1.2和2021.1中没有其他东西。您使用的是什么版本/什么平台/什么编译选项?即使直接在打开的文件说明符上添加trim也没有意义-语言规则要求“忽略任何尾随空格”(F2018 12.5.6.10p1)。恐怕我只能假设您正在阅读的文件与我通过剪切并粘贴到文件中获得的文件有所不同。另一个完整的猜测-您是否检查过文件中没有无关的控制字符?[不知道如何在Windows下进行此操作]嗯-如果您将上述内容剪切并粘贴到一个新文件中,然后尝试阅读,会发生什么情况?