读取文件时宏定义的有效方法?

Posted

技术标签:

【中文标题】读取文件时宏定义的有效方法?【英文标题】:Efficient way for macro definition in reading a file? 【发布时间】:2014-03-09 02:55:17 【问题描述】:

问题描述:

我想要这个效果。我正在使用 C++ 读取输入文件。我想以这种方式设计我的输入文件:

....blahblah.....
Define Length 20
Node ($Length 0.1 0.1)
....blahblah.....

这样$Length会自动替换为20。

我正在考虑更一般的情况:例如给定任意字符串

Node ($strLengthUnknown 0.1 0.1)

我会首先将整个字符串拆分为单词,然后查找是否有一些单词以 $ 符号开头,然后进行替换。

我的问题:

我想知道有没有更聪明的方法?而且我不想重新发明***。因此,如果您知道有更好的方法/库已经可以做到这一点,请告诉我。谢谢

【问题讨论】:

【参考方案1】:

你可以拆分字符串——这个问题已经被问过很多次了: Split a string in C++? 然后,您可以搜索单词并进行替换。

但是,更简单的方法是搜索“$”符号并检查“$”之前的前一个字符是否不属于单词 - 示例中的空格或括号。我不知道你文件的全部语法,但如果我们要查找以字母开头的标识符,检查 '$' 之后的下一个字符就足够了。

    string x = "Node ($Length 0.1 0.1)";
    size_t len = x.length();
    size_t pos = 0;
    while((pos = x.find("$",pos)) != string::npos) 
        if(pos == 0 || isspace(x[pos-1]) || x[pos-1] == '(') 
            if(pos != (len -1) &&  isalpha(x[pos+1])) 
                //find the length of word, starting from pos
                //do the replacement, update pos
                x.replace(pos,word_length,string_to_replace);
                pos += word_length;
             else 
                ++pos;
            
         else 
            ++pos;
        
    

【讨论】:

【参考方案2】:

我建议您查看现有的实用程序来预处理您的文件,然后再将其用作应用程序的输入。一种这样的可能性是 C 预处理器本身。您可以在文件中使用标准预处理器指令,然后通过预处理器运行文件,然后使用预处理器的输出。

这将取决于输入文件的实际文本以及 C 预处理器将输入文件中的某些文本解释为预处理器指令是否存在问题。

C Processor as independent tool 也提供了一些替代方案。

或Using the C Preprocessor for languages other than C。

【讨论】:

以上是关于读取文件时宏定义的有效方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用python读取1TB HDFS csv文件的有效方法是啥

在 C++ 中从文件末尾读取的最有效方法是啥? (解析文件中的最后 128 位)

python 从文件中读取单词的有效方法。

在python中读取15 M行csv文件的有效方法

在 Azure Databricks 中的日期范围之间读取镶木地板文件的有效方法

最有效的文件读取方式