1

私は現在、コマンドを読んでいるプロジェクトに取り組んでおり、空白の行に空白を避ける必要があります。この時点まではうまくいきましたが、何らかの理由でそれを機能させる方法を理解できないようです。if(opcode == "\t" || opcode == " ")continue;私は世話をすると思ったが、そうではなかった。誰かが見てくれて、私を助けてくれたら、それは素晴らしいことです.

これは、私が読んでいるコマンドの小さなサンプルです。それらは [label] opcode [arg1][,arg2] 形式です。

#Sample Input
LA 1,1
LA 2,2
\t <<<<<<<Here just to show that it's a blank line with only a tab
TOP NOP

これが私のコードです:

    int counter = 0;
int i = 0;
int j = 0;
int p = 0;

while (getline(myFile, line, '\n'))
{


    if (line.length() == 0)
    {
        continue;
    }

    if (line[0] == '#')
    {
        continue;
    }


    // If the first letter isn't a tab or space then it's a label

    if (line[0] != '\t' && line[0] != ' ')
    {

        string delimeters = "\t ";

        int current;
        int next = -1;


        current = next + 1;
        next = line.find_first_of( delimeters, current);
        label = line.substr( current, next - current );

        Symtablelab[i] = label;
        Symtablepos[i] = counter;

        if(next>0)
        {
            current = next + 1;
            next = line.find_first_of(delimeters, current);
            opcode = line.substr(current, next - current);


            if (opcode != "WORDS" && opcode != "INT")
            {
                counter += 3;
            }

            if (opcode == "INT")
            {
                counter++;
            }

            if (next > 0)
            {
                delimeters = ", \n\t";
                current = next + 1;
                next = line.find_first_of(delimeters, current);
                arg1 = line.substr(current, next-current);

                if (opcode == "WORDS")
                {
                    counter += atoi(arg1.c_str());
                }
            }

            if (next > 0)
            {
                delimeters ="\n";
                current = next +1;
                next = line.find_first_of(delimeters,current);
                arg2 = line.substr(current, next-current);

            }
        }

        i++;

    }

    // If the first character is a tab or space then there is no label and we just need to get a counter
    if (line[0] == '\t' || line[0] == ' ')
    {
        string delimeters = "\t \n";
        int current;
        int next = -1;
        current = next + 1;
        next = line.find_first_of( delimeters, current);
        label = line.substr( current, next - current );

    if(next>=0)
        {
            current = next + 1;
            next = line.find_first_of(delimeters, current);
            opcode = line.substr(current, next - current);



            if (opcode != "WORDS" && opcode != "INT")
            {
                counter += 3;
            }

            if (opcode == "INT")
            {
                counter++;
            }


            if (next > 0)
            {
                delimeters = ", \n\t";
                current = next + 1;
                next = line.find_first_of(delimeters, current);
                arg1 = line.substr(current, next-current);

                if (opcode == "WORDS")
                {
                    counter += atoi(arg1.c_str());
                }

            }



            if (next > 0)
            {
                delimeters ="\n\t ";
                current = next +1;
                next = line.find_first_of(delimeters,current);
                arg2 = line.substr(current, next-current);

            }
        }

    }
}
4

2 に答える 2

1

std::stringstream を使用して、行から std::string 変数に読み取ります。このように、空白は省略されます。

[更新] 最初から空白の空白を削除する場合:

s.erase(s.find_last_not_of(" \n\r\t")+1);

[UPDATE2] または、読みながら単語を数えるだけです。

この例のように:

#include <iostream>
#include <sstream>
#include <string>

int main() {

  std::string line;
  while (std::getline(std::cin, line))
  {
      std::string lineNoWS = line;
      lineNoWS.erase(lineNoWS .find_last_not_of(" \n\r\t")+1);
      if (lineNoWS.empty())
        std::cout << "EMPTY LINE\n";

      std::string word;
      unsigned words = 0;
      std::istringstream line_is(line);
      while(line_is >> word)
      {
         std::cout << '\'' << word << "'\n"; 
         ++words;
      }
      std::cout << "(" << words << ")ENDLINE\n"; 
  }
}

std::cin を に置き換えるだけifstream(file)です。

于 2012-09-17T08:34:36.347 に答える
0

おそらく、コマンドの読み取りをより「一般的」にするようにしてください。有効な行はラベルで始まる必要があり、ラベルには「\t」、「\n」、「\r」、「#」、(...) をチェックする代わりに「文字」のみを含めることができると仮定します関数isalphaを使用していませんか?

次に、引数を取得する必要があります。引数が「,」で区切られていると仮定すると、最善の方法は「,」区切り記号に従って行を分割することです。

「ラベル」と「引数」を含むベクトルを取得するいくつかのサンプルコード。ラベルも検証することをお勧めします(たとえば、ラベルが文字のみで構成されているかどうかを確認し、「コマンド」を知っていると仮定します)特定のラベルに対して取得する引数の数とタイプを検証します。

std::ifstream inStream("c:\\data\\dump.txt");   
    if(!inStream.fail())
    {
        while(!inStream.eof())          
        {
            std::string strLine;
            std::getline(inStream, strLine);

            // Label ?
            if( isalpha(strLine[0]))
            {
                int iIndexOf = strLine.find(" ");
                if(iIndexOf != string::npos)
                {
                    std::string strLabel = strLine.substr(0, iIndexOf);

                    // Arguments ?
                    std::vector<std::string> vArguments;
                    std::stringstream ss(strLine.substr(iIndexOf, strLine.size() - iIndexOf));  

                    std::string strArgument;
                    while(std::getline(ss, strArgument, ','))   
                    {                           
                        if(strArgument.size()!=0)                                                           
                            vArguments.push_back(strArgument);
                    }


                    std::cout << "label: " << strLabel << std::endl << "arguments list: ";
                    for(size_t i=0; i<vArguments.size(); i++)
                        std::cout << vArguments[i] << ";";
                    std::cout << std::endl;
                }
                else
                {
                    // No Arguments
                    std::string strLabel = strLine;                                     
                    std::cout << "label: " << strLabel << std::endl;                    
                }
            }           
        }

        inStream.close();
    }
于 2012-09-17T09:23:34.103 に答える