在文本文件中查找特定字符?

时间:2014-01-20 22:07:46

标签: c++ c

我有一个文本文件,如下所示:

Fulladder

3个输入

INPUT(A)

INPUT(B)

INPUT(CIN)

现在我需要知道输入的名称,这里是'A','B'和'Cin'。我可以打开文件并阅读它。但我得到了奇怪的输出。我的代码如下:

// Finding the names of inputs
    if(buffer[i] == 'I' && buffer[i+1]=='N' && buffer[i+2]=='P' && buff     er[i+5]=='(')
    {
        if( buffer[i+7]==')' ) // i.e. single digit Input name
        {
            char inputName[1];
            inputName[0] = buffer[6];
            string name(inputName);
            cout<<"\n Name of inputs:  "<<inputName[0]<<"\n";
        }

        else if( buffer[i+8]==')' ) // To check is the value of value of inputs consists of one digit or two digit
        {

            char inputName[2];
            inputName[0] = buffer[6]; inputName[1] = buffer[7];
            string name(inputName);
            cout<<"\n Name of inputs:  "<<inputName[0]<<inputName[1]<<"\n";
        }

        else if( buffer[i+9]==')' ) // i.e. three digit Input name
        {
            char inputName[3];
            inputName[0] = buffer[6]; inputName[1] = buffer[7]; inputName[2] = buffer[8];
            string name(inputName);             
            cout<<"\n Name of inputs:  "<<inputName[0]<<inputName[1]<<inputName[2]<<"\n";
        }


    }

但我得到以下输出:

输入名称:a

输入名称:a

输入名称:添加

4 个答案:

答案 0 :(得分:4)

从缓冲区复制字符时,忘记按i进行偏移。例如:

inputName[0] = buffer[6];

应该是:

inputName[0] = buffer[i+6];

答案 1 :(得分:2)

#include <iostream>
#include <string>
using namespace std;

string getpart(string &input){
    string pre("INPUT(");
    string ret("");
    size_t len = pre.length();
    size_t pos = input.find(pre);
    if(pos == 0){
        pos = input.find(")", len);
        ret = input.substr(len, pos - len);
    }
    return ret;
}

int main() {
    string input, part;
    for(int i=0; i<3 ; ++i){
        cin >> input;
        part = getpart(input);
        cout << part << endl;
    }
}

#include <iostream>
#include <string>

using namespace std;

string getpart(string &input, const char *pre, const char *post){
    string ret("");
    string::size_type pre_pos = input.find(pre), len = string(pre).length();
    if(pre_pos != string::npos){
        pre_pos += len;
        string::size_type post_pos = input.find(post, pre_pos);
        if(post_pos != string::npos)
            ret =  input.substr(pre_pos, post_pos - pre_pos);
    }
    return ret;
}

int main() {
    string input, part;
    getline(cin, input);
    part = getpart(input, "INPUT(", ")");
    cout << part << endl;
}

答案 2 :(得分:1)

看起来你有一个计数器“i”,它可能代表当前行的开头,但是当你实际将字符拉出数组时,你正在读取固定索引。

例如,对于单字符的情况,您应该从“buffer [i + 6]”而不是“buffer [6]”中读取。

话虽如此,我强烈建议您编写一些函数来弄清楚如何解析这些行,这样就不必为每个可能的值长度编写代码。

答案 3 :(得分:1)

@ user2440724 - 关于您对我的评论的问题:查看(运行)这个使用strtok()的小例子。在您单步执行时,设置一个断点并查看buf的值:

#include <ansi_c.h>

int main(void)
{
    char buffer[]="INPUT(A)"; //simulated line buffer
    char *buf;

    buf = strtok(buffer, "(");//strip away INPUT and (
    buf = strtok(NULL, ")");//Capture contents of ( )
    //do something with "A", read next line buffer

    return 0;
}