То, как вы анализируете свои данные, зависит от вашей файловой структуры, и помните, что вы можете структурировать свой файл в соответствии с вашим собственным конкретным форматом, если вы будете придерживаться своего соглашения.
Вы можете делать это, как пытались:
SingleWordName Class DamageType AttackType
"Multiple Word Name" Class DamageType AttackType
Тогда вам придется анализировать каждую строку (строку) текста по отдельности, но вы также можете упростить ее, изменив структуру вашего текстового файла.Если вы знаете, что повсюду будет похожий шаблон, который не изменится, то что-то подобное может сделать его более легким для вас.
SingleWordName or Multiple Word Name
AbilityType
AttackType
DamageType
NextName
AbilityType
AttackType
DamageType
Тогда, если вы структурируете его таким образом, вы знаете, что каждая строка содержитстрока, первая строка в наборе будет переменной имени вашего класса Entity, а следующие три будут заполнять структуру атрибутов в этом классе.Затем пустая строка, которую можно игнорировать.Эта пустая строка предназначена только для визуальных ссылок на чтение, чтобы читатель-человек мог легко отличить одну сущность от другой.
Вы даже можете структурировать свой файл следующим образом:
Entity Name Single Or Multiple Words
AbilityType AttackType DamageType
Next Entity
AbilityType AttackType DamageType
Такая структурабудет принимать первую строку текста или строки и устанавливает имя объекта, а затем вторая строка содержит все поля для структуры атрибутов.Этот случай будет работать достаточно легко, если все ваши атрибуты будут только одним словом.Если у вас есть атрибуты, состоящие из нескольких слов, и вам не нравится идея заключать их в кавычки, скобки, скобки и т. Д., Вы можете просто использовать подчеркивание между каждым словом, например:
Baron_Samedi
Затем один разу вас есть это слово, вы можете найти любой _
в этом слове, удалить его из строки и заменить его на ' '
.
Существует несколько способов анализа строковых данных, и все это зависит от двух основных факторов: во-первых, ваших данных или структур классов, а затем - вашей файловой структуры, которую вы используете для представления этой структуры данных.Если у вас есть эти два на месте, у вас есть ваш фундамент, тогда это вопрос использования этой информации и построения вашей функции синтаксического анализа из нее.
Редактировать - следить заОП комментируют путаницу разбора строки между кавычками:
Если у вас есть строка в кавычках " "
;Проблема здесь в том, что вам нужно выполнить более одного поиска по этой строке для одного символа "
, и вам нужно сохранить индекс того, где вы нашли first_occurence_of "
, а также next_occurence_of "
.После нахождения первого вхождения и сохранения его местоположения индекса вам придется перебирать эту последовательность символов, например массив, до тех пор, пока вы не найдете следующий "
, и снова вам также потребуется сохранить это местоположение индекса.Затем вы должны получить разницу между ними.
Что касается простого примера, мы будем использовать "Hello"
с кавычками, являющимися нашей строкой, которая имеет всего 7 символов.Первый "
имеет индекс 0
, а следующий - индекс 6
.Затем вам потребуется подстрока [(first + 1), (next-1)] из этой исходной строки.
[0][1][2][3][4][5][6]
["][H][e][l][l][o]["]
Как вы можете видеть выше, первая "
имеет индекс 0
иследующий по индексу 6
.Общая длина строки равна 7. Мы можем использовать эту информацию и предоставленные строковые функции из stl для создания подстроки из этой исходной строки.Но нам нужно искать строку от начала и до конца, чтобы найти оба местоположения нашего начального и конечного разделителей.
// Pseudo Code
substring = [(original.firstIndexFound(") + 1) to (original.nextIndexFound(")-1)];
// Where the [] indicates inclusive at that position...
substring = [(0+1) to (6-1)] = [1,2,3,4,5]
// broken down into individual array indices..
substring[0] = original[1]
substring[1] = original[2]
substring[2] = original[3]
substring[3] = original[4]
substring[4] = original[5]
// Visual Translation:
// Original:
[0][1][2][3][4][5][6]
["][H][e][l][l][o]["]
// Sub
[0][1][2][3][4]
[H][e][l][l][o]
Это все равно будет работать, если между словами есть пробелы, потому что функция, которую вы вызываете с разделителемне ищет
, но "
или любой другой символ, который вы определяете в качестве разделителя.
Вот простая программа для демонстрации разбора строки между " "
.
#include <string>
#include <iostream>
int main() {
std::string str = { "\"Hello\"" }; // need the \" for quote in the string
std::cout << "Original String = " << str << '\n';
size_t first = str.find_first_of('"');
size_t next = str.find_first_of('"', first + 1);
std::cout << "First index at: " << first << "\nNext index at: " << next << '\n';
std::string sub = str.substr(first + 1, next - 1);
std::cout << "Substring = " << sub << '\n';
return 0;
}
-выход-
Original String = "Hello"
First index at: 0
Next index at: 6
Substring = Hello
-Note-
В приведенном выше описании нет проверки работоспособности, чтобы определить, не было ли вообще никакого символа "
в строке.Это достаточно просто сделать, все, что вам нужно сделать, это сначала проверить, не находится ли индекс или итератор строки в конечной позиции, если он находится в конечной позиции, то просто вернуть обратно исходную строку, в противном случае просто выполните описанное выше.расчеты без изменений.