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

时间:2014-03-09 02:55:17

标签: c++ regex string macros io

问题描述:

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

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

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

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

Node ($strLengthUnknown 0.1 0.1)

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

我的问题:

我想知道有更聪明的方法吗?而且我不想重新发明轮子。所以如果你知道有更好的方法/库已经可以做到,请你告诉我。感谢

2 个答案:

答案 0 :(得分:1)

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

然而,更简单的方法是搜索'$'符号并检查它是否在'$'之前的前一个字符不属于word - 空格或示例中的括号。我不是你文件的全部语法,但是当我们查找以字母开头的标识符时,检查'$'之后的下一个字符就足够了。

    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;
        }
    }

答案 1 :(得分:1)

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

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

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

Using the C Preprocessor for languages other than C