2015-04-23 2 views
0

Итак, я работаю над загрузчиком модели в своей программе DirectX 11, и я столкнулся с тем, что я считаю уникальной проблемой. Поэтому я потратил немного времени на поиск решения, но этого не сделал. Моя проблема заключается в том, что в моем файле, который имеет путь к текстуре и список вершин, я хочу иметь возможность выбирать определенные части и удалять некоторые из них. Ниже мой пример файла для текстур меньше треугольника:Расширенные операции с файлами и строками

T:0$ 
(0, 5, 0) 
(5, 0, 0) 
(-5, 0, 0) 

^ЭТО СТАРЫЙ, ПОСМОТРИТЕ НА EDIT НИЖЕ^

Позвольте мне объяснить, что здесь происходит. Во-первых, «T: ___» - это мой путь к тексту. Я установил значение «0», потому что я не использую текстуру. «$» После «T: 0» - это знак моей программы для конца пути файла и начала вершин.

Теперь вот что мне нужно для моей программы.

1. Прочтите файл, пока символ «$» не будет достигнут. Затем удалите первые два символа («T:») и «$», если они были добавлены. Наконец, поместите оставшийся текст в строку TextureData. Постскриптум Не удаляйте «T:» из файла, просто мою строку (файл должен оставаться нетронутым).

2. Поместите оставшийся текст (вершины) во временную строку под названием VertexData, а затем, возможно, удалите скобку ..? Я хотел бы знать, как это сделать, но, возможно, не использовать его в данный момент.

Надеюсь, я поставил себя и свою проблему достаточно ясно.

Заранее благодарен.

--- ВАЖНО EDIT ---

Я изменил свой формат немного, я посмотрел на файл .obj и решил, что это будет легче сделать. Моя текстура и вершинных файл теперь выглядит следующим образом:

T:0$ 
v 0 5 0 
v 5 0 0 
v -5 0 0 

--- КОНЕЦ EDIT ---

Этот код здесь то, что я в качестве основы:

Модель функция загрузки:

bool LoadTVF(string FP) 
{ 
    ifstream TVFReader; 
    TVFReader.open(FP); 
    if (TVFReader.is_open()) 
    { 
     ReadLine(1); // Function not fully working, need to improve 
     // Load vertices and texture into strings 
     TVFReader.close(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Функция ReadLine (только для того, чтобы организовать мой код и перейти к определенной строке и получить данные линий и поместить в строку, резание и модификация строки необходимо вернуть в m ain):

string ReadLine(int character) 
{ 
    return lineData; // I know this doesn't work, just don't know what to return? 
} 

Честно говоря, с этой функцией ReadLine я понятия не имею, что я делаю. Я просто создавал какой-то фрейм, чтобы показать вам, как я предпочитаю, чтобы код был организован.

Еще раз спасибо.

+0

Что вы делали до сих пор? – n0rd

+0

Я добавлю это в вопрос, одну секунду. – Xenonic

+0

также, пока вы на это: какие у вас вопросы? – n0rd

ответ

1

Это, как я хотел бы сделать это:

bool LoadTVF(string FP) 
{ 
    ifstream TVFReader; 
    TVFReader.open(FP); 
    if (TVFReader.is_open()) { 
     stringstream buffer; 
     buffer << TVFReader.rdbuf(); 
     string texture_string = buffer.str(); 
     texture_string = texture_string.substr(2, texture_string.length()); 
     // Removes T: 
     texture_string.erase(texture_string.begin() + texture_string.find("$")); 
     // Removes the first occurrence of $ 
     std::cout << texture_string; 
     /* This will print out: 
     * 0 
     * v 0 5 0 
     * v 5 0 0 
     * v -5 0 0 
     */ 
     TVFReader.close(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Это не использует ReadLine функцию, поскольку она загружает всю строку сразу. Поскольку я только манипулирую этой строкой в ​​начале, я предпочел бы, чтобы логика синтаксического разбора и обрезки происходила в одном месте.

Если вы должны повторять линию за линией, уже есть способ сделать это с помощью getline:

bool LoadTVF(string FP) 
{ 
    ifstream TVFReader; 
    TVFReader.open(FP); 
    if (TVFReader.is_open()) { 
     string line; 
     while(getline(TVFReader, line)) 
     { 
      // Do stuff with each line 
     } 
     TVFReader.close(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Обратите внимание, что эти line s не имеют конца-строки символов в них.

Edit: Согласно комментариям Op, вот как вы бы разделить анализируемый файл на отдельные строки:

bool LoadTVF(string FP) 
{ 
    ifstream TVFReader; 
    TVFReader.open(FP); 
    if (TVFReader.is_open()) { 
     string header; 
     getline(TVFReader, header); 
     header = header.substr(2, header.length()); 
     // Removes T: 
     header.erase(header.begin() + header.find("$")); 
     // Removes the first occurrence of $ 
     std::cout << header << std::endl; 
     // This should print 0, which is the string between T: and $ 

     stringstream buffer; 
     string line; 
     while (getline(TVFReader, line)) 
     { 
      line = line.substr(2, line.length()); 
      // Removes the starting "v " 
      buffer << line << std::endl; 
      // We need the end-of-line here because its been stripped 
     } 
     string texture_string = buffer.str(); 
     std::cout << texture_string; 
     /* This will print out: 
     * 0 5 0 
     * 5 0 0 
     * -5 0 0 
     */ 
     TVFReader.close(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Несколько замечаний я хотел бы сделать здесь. Если вы контролируете способ структурирования вашего файла, вам не потребуется символ $, чтобы указать конец этой строки. Тот факт, что есть новая строка, должен быть достаточным для этого. Кроме того, поскольку каждая строка после этого представляет вектор в матрице, я не думаю, что необходим v. Наконец, T: также может быть ненужным, если ваши файлы названы соответствующим образом, например "test.texture". Таким образом, вы знаете, что файл, который вы читаете, является текстурой.

Это уменьшит сложность анализа этих файлов и в качестве бонуса уменьшит размеры хранилища для них.

+0

Это выглядит великолепно! Но прежде чем отметить это как правильный ответ, у меня две небольшие проблемы. Первый - это «строковый буфер», который дает мне эту ошибку: _incomplete type not allow_ Есть ли пропущенный параметр? И вторая проблема заключается в том, что я хочу выделить «0» после «T:». Все, что нужно, чтобы стереть все после этого. Просто боковое примечание, было бы здорово, если бы вы могли указать мне в правильном направлении, чтобы изолировать вершины, просто удалив «v» и «T: 0 $» вверху! Спасибо за вашу помощь! – Xenonic

+0

Для вашей первой проблемы включите заголовок ''. – huu

+0

Все хорошо там сейчас. – Xenonic

1

До сих пор похоже, что вы можете читать свой файл по строкам, используя getline, а затем извлекать необходимую информацию: выяснить «тип линии», проверив первый символ, а затем в зависимости от типа либо получить подстроку с контуром, либо разделить строку на куски и конвертировать их в плавающие.

Позже, когда формат файла становится более сложным, вы можете написать полноразмерный парсер, возможно, используя какой-то генератор парсера.

Смежные вопросы