gpt4 book ai didi

c++ - Fortran ifstream 等价物

转载 作者:行者123 更新时间:2023-11-30 01:13:06 25 4
gpt4 key购买 nike

在 C++ 中,您可以使用 std::ifstream 从文件或字符串中读取。我想在现代 FORTRAN 中做等价的(或类似的)。

具体来说,我有一个现有的 FORTRAN 程序,它将一个文件作为输入并对其执行逐行读取操作。我可以使用相同的逻辑轻松地将其转换为在运行时解析文件或字符串吗?例如,如果使用 read 语句,它们应该对文件或字符串起作用。

更新

这是一个简单的 C++ 片段,展示了我想要做什么。请注意,我调用了 1 个 Parse() 函数来从文件或字符串中导入:

void ImportFile( const std::string &file_name ) {
std::istream is( file_name.c_str() );
Parse( &is );
}

void ImportString( const std::string &str ) {
std::stringbuf sbuf( str );
std::istream is( &sbuf );
Parse( &is );
}

void Parse( istream *is ) {
std::string line;
while( *is ) {
getline( *is, line );

// Process line ...
}
}

最佳答案

是的,您可以这样做并且无需对您的代码做太多更改,因为 read 可以从文件或字符变量中读取。

考虑示例代码:

program test
implicit none
integer :: fin, varC, varC2
real :: varA, varA2
character(len=4) :: varB, varB2
character(len=13) :: string_input = '1234.5 TEST 2'

open(newunit=fin, file='filein.dat', form='formatted', access='stream', status='old')
read(fin,*) varA, varB, varC
print *, varA, varB, varC
close(fin)

read(string_input,*) varA2, varB2, varC2
print *, varA2, varB2, varC2
end program test

和输入文件filein.dat:

1234.5 TEST 2

当这个程序被执行时,它会打印:

1234.50000     TEST           2
1234.50000 TEST 2

可以看到无论数据是在字符变量中还是通过文件IO单元访问,读取本质上是一样的。对于文件大小写,您提供单元编号,对于字符串大小写,您提供包含数据的字符变量。


Fortran 标准将字符变量上的 IO 称为“内部文件”。如果您的 IO 是面向记录的,您可以为每条记录提供一个字符标量,或者为每个数组元素提供一个记录的字符数组。内部文件的一个限制是您不能在 opencloseinquire 语句中使用它们。这意味着您不能将您的字符串与数字单位编号相关联。 read 语句中必须使用字符变量本身,而不是单元号。适应这一点可能是修改程序以从字符串而不是文件中读取的最大障碍(除了将数据放入字符变量中)。

关于c++ - Fortran ifstream 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com