2017-08-23 49 views
-1

我想从fmt格式的变量文件中读取特定数据。在这种情况下,所需的数据是a,bc以及fft coefficients (width,height,depth)(25,300,300)的值。阅读文本文件中的特定数据(C)

一个例子是从该文件将变量分配: a = 2.467 b = 30.000 c = 30.000 width = 25 height = 300 depth = 300。 这些值会随着输入文件的变化而改变。

目前我能想到的唯一方法就是在文本文件中读取它们。但我不喜欢这个,因为如果文本文件在布局上略有变化,它很容易出现错误。任何人都可以提出一种替代方法(是否有类似于C中的Python重新模块)?

请参考下面的示例文本文件:

BEGIN header 

     Real Lattice(A)    Lattice parameters(A) Cell Angles 
    2.4675850 0.0000000 0.0000000  a = 2.467585 alpha = 90.000000 
    0.0000000 30.0000000 0.0000000  b = 30.000000 beta = 90.000000 
    0.0000000 0.0000000 30.0000000  c = 30.000000 gamma = 90.000000 

1       ! nspins 
25 300 300    ! fine FFT grid along <a,b,c> 
END header: data is "<a b c> pot" in units of Hartrees 
+1

“如果文本文件在布局上略有变化,容易出现错误” - 如果您不能依赖某种文件格式来保持恒定/一致,那么任何人都很难编写解析器,甚至是Python包开发人员。您可以在Python中执行的所有操作也可以在C中完成。 –

+0

如果您按行'a'读取文件行,'b'和'c'很容易被存储,因为它的写法类似于'a = value'文件。但是'fft系数'并不那么简单,但是如果它们的位置总是相同的(也就是说总是写入'精细FFT [...]]'在这一行)这也很容易。 –

+0

请至少提供“fmt”格式相关规范的链接。我从来没有听说过它。 –

回答

1

你首先应该指定和正式实际file format您输入的(一个例子是不够的)。至少出于文档目的,您可能会使用某些EBNF表示法(我可以猜到但不确定其中BEGINLattice是否重要,但fmt wikipage没有提及它们)。

一个例子是从这个文件

这是一个错误的做法。您需要知道您的程序将能够处理的通用文件格式,这是您软件设计的一部分。所以最好先指定它。

然后你会使用通常的parsing技术。另请阅读有关lexical analysis。也许parser generatorGNU bison可能会有所帮助,或者简单的recursive descent parser就足够了。也许你的输入格式关心的是行,然后你可以一个接一个地读(例如POSIX​​)并解析它们。

阅读Dragon Book是值得的。

有没有用C类似蟒蛇重模块东西

POSIX有<regex.h>;见regcomp(3);再看看pcre2。我不确定它在这里是相关的。

+1

在我看来,野牛解析器和词法分析的研究对于这个简单的问题来说太过于矫枉过正了,不是吗? –

+0

我不知道什么是文件格式,所以我无法回答。 –

+0

这是一个fmt文件 –