Хотя вы уже получили ответы на заданный вопрос, возможно, стоит ответить на некоторые из них, которые должны знать о коде, который вы не задавали:
void loadInstructions(char* fileName)
Поскольку функция не будет изменять имя файла, вы почти наверняка захотите изменить его на:
void loadInstructions(char const *fileName)
или
void loadInstructions(std::string const &fileName)
ifstream input;
input.open(fileName);
Гораздо чище их объединить:
ifstream input(fileName);
или (если вы передали строку вместо):
ifstream input(fileName.c_str());
while(!input.eof());
Это уже было покрыто.
string line;
getline (input,line);
char * lineChar = &line[0];
//instruction cmd; //This will be used later to store instructions from the parse
char * token;
token = strtok (lineChar," ");
// just trying to get the line number for now
int lineNumber = atoi(token);
Большая часть всего этого посторонняя. Вы можете просто позволить atoi
конвертировать непосредственно из исходного ввода:
string line;
getline(input, line);
int lineNumber = atoi(line);
Если вы собираетесь использовать токены позже, вы можете использовать strtol
вместо:
char *end_ptr;
int lineNumber = strtol(line, &end_ptr, 10);
Это установит end_ptr
, чтобы указывать сразу после конца части, которая strtol
преобразована.
Я бы также рассмотрел альтернативный вариант: переместить ваш код для чтения и анализа строки в класс и определить operator>>
, чтобы прочитать их:
struct line {
int number;
operator int() { return number; }
};
std::istream &operator>>(std::istream &is, line &l) {
// Just for fun, we'll read the data in an alternative fashion.
// Instead of read a line into a buffer, then parse out the first number,
// we'll read a number from the stream, then ignore the rest of the line.
// I usually prefer the other way, but this is worth knowing as well.
is >> l.number;
// When you're ready to parse more, add the extra parsing code here.
is.ignore(std::numeric_limits<std::istream::pos_type>::max, '\n');
return is;
}
С этим мы можем довольно легко распечатать номера строк:
std::copy(std::istream_iterator<line>(input),
std::istream_iterator<line>(),
std::ostream_iterator<int>(std::cout, "\n"));
input.close();
Обычно я просто позволяю потоку автоматически закрываться, когда он выходит из области видимости.