我正在开发一个项目,我正在阅读命令,我需要避免空白行上的空格。到目前为止,我已经做得很好,但由于某种原因,我似乎无法弄清楚如何让它发挥作用。我以为if(opcode == "\t" || opcode == " ")continue;
会照顾,但事实并非如此。如果有人可以请一看,并帮助我,这将是伟大的。
以下是我正在阅读的命令的一小部分示例。它们采用[标签]操作码[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);
}
}
}
}
答案 0 :(得分:1)
使用std :: stringstream并从你的行读取到std :: string变量。这样就省略了空白。
[UPDATE] 如果要从头开始删除空白空格:
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";
}
}
只需用您的ifstream(file)
替换std :: cin。
答案 1 :(得分:0)
您应该尝试使命令的读取更“通用”。 假设一条有效的行必须以标签开头,你的标签只能包含“字母”,而不是检查'\ t','\ n','\ r','#',(...) 你为什么不使用 isalpha 这个函数?
然后你需要获取参数,并假设它们被','分隔,你最好的方法是根据','分隔符分割线。
一些示例代码,它为您提供“标签”和带有“参数”的向量,我建议您也验证标签(例如,检查标签是否仅由字母组成,并假设您知道“commands”验证要为特定标签检索的参数的数量和类型。
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();
}