Чтение из файла и исключение пробелов в пустых строках

В настоящее время я работаю над проектом, в котором я читаю команды, и мне нужно избегать пробелов в пустых строках. Я добился успеха до этого момента, но по некоторым причинам я просто не могу понять, как заставить это работать. я думал 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);

}
}

}
}

1

Решение

Используйте std :: stringstream и читайте из вашей строки переменные std :: string. Таким образом, пробел будет опущен.

[ОБНОВИТЬ] Если вы хотите удалить пустые пробелы с самого начала:

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

[ОБНОВЛЕНИЕ2] Или просто считать слова во время чтения:

Как в этом примере:

#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),

1

Другие решения

Возможно, вам следует попытаться сделать чтение команд более «общим».
Предполагая, что строка должна быть действительной, должна начинаться с метки, а ваши метки могут содержать только «буквы» вместо проверки на «\ 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();
}
0

По вопросам рекламы [email protected]