2014-01-05 7 views
-1

Я пытаюсь создать систему, в которой я могу читать из .txt-файла, а затем действовать по найденному. Так сказать, что я хочу сделать уровень, я не должен был бы жесткий код каждого блока, я мог бы просто сделать .txt файл, который говорит что-то вроде:Чтение данных из .txt (C++)

ooooo 
ooooo 
oxxxo 

считанного из него, и создать уровень основан офф из этого. Все в порядке и весело, ожидайте, что я не понимаю, как читать из текстового документа и действовать на основе его содержимого. (Хотя я знаю, что это не самый лучший, самый оптимальный или очень чистый способ, это не об этом. Извиняюсь за то, как это может показаться «грубой силой». Пожалуйста, поймите.)

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

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

string input; 

int main(){ 
    ofstream textFile; 
    cout << "Enter text to write to file: " << endl; 
    getline(cin, input); 
    textFile.open ("example.txt"); 
    textFile << "\n" << input; 
    textFile.close(); 
    return 0; 
} 

Возможно, если бы вы могли создать пример на основе этого, который объясняет, как это сделать?

Заранее спасибо.

+0

Ваш вопрос не очень понятно. Вы хотите создать уровень, основанный на * what *? – 0x499602D2

+0

Я рекомендую вам искать StackOverflow для «[C++] read from file», так как эта проблема возникает еженедельно и ответила много раз. –

ответ

0

Если вы хотите знать, как читать из файла, проверьте код, который я написал.

example.txt

hello 
who are you? 

код:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
using namespace std; 

int main(){ 

    string line, cell; 
    ifstream myfile("example.txt"); 
    // try to open the file, else if you cannot throw exception 
    try 
    { 
     myfile.is_open(); 

      // read each line into line 
      while (getline(myfile, line)) 
      { 
       cout << "Line contains: " << line << endl; 
       // copy the line into lineSteam, so we can store them into a string delimited 
       stringstream lineStream(line); 
       while (getline(lineStream, cell, ' ')) 
       { 
        cout <<"Words delimited by space: "<< cell << endl; 
       } 
      } 
    } 
    // display the exception thrown 
    catch (ifstream::failure e) { 
     cout << "Exception opening/reading file: " << e.what(); 
    } 

    return 0; 
} 
+1

Вы должны поощрять OP для поиска в Интернете и переполнения стека в первую очередь. Чтение из файла является популярной проблемой и много раз отвечало. –

+0

Я согласен с этим. – meWantToLearn

0

Я предполагаю, что вы хотите сделать уровень на основе сетки из вашего текстового файла? Вам понадобится цикл while, который будет читать строки из текстового файла в строку и int, чтобы отслеживать, сколько циклов вы сделали.

В этом цикле while вам понадобится цикл, который будет перебирать по каждому из символов в той строке, которую вы только что прочитали (getLine). Используя этот символ, вы можете решить, что если это «х», вы можете поместить стену в соответствующую позицию сетки.

Следя за тем, сколько вы выполняли итерации цикла, и какое положение персонажа вы читаете в строке, которое даст вам позицию сетки (т.е. 3, 2).

Я сделал что-то похожее на игру, которую я сделал в тот же день.

Tile *** TileGrid; 

//load in the file 
std::ifstream levelData; 
levelData.open(fileName); 

std::string levelInfo; 

//loop through all the lines, counting the height of the map 
TilesTall = 0; 
while (levelData.eof() == false) { 

    std::getline(levelData, levelInfo); 
    TilesTall++; 
} 

//get the last line of the map data and count how many characters there are across for the tiles wide 
TilesWide = levelInfo.size(); 

//reset the file line pointer 
levelData.clear(); 
levelData.seekg(0, std::istream::ios_base::beg); 

//using this info we can now create our tile grid 
TileGrid = new Tile**[TilesTall]; 
for (int i = 0; i < TilesTall; i++) 
    TileGrid[i] = new Tile*[TilesWide]; 

//now read in the rest of the level data 
for (int row = 0; row < TilesTall; row++) { 

    std::string loopedString; 
    std::getline(levelData, loopedString); 

    //loop through this lines characters getting the type from the char 
    for (int i = 0; i < TilesWide; i++) { 

     char indexChar = loopedString[i]; 
     CoverTypes type; 

     bool isSpawnPoint = false; 

     //parse the cover type 
     switch (indexChar) { 

     case 'L': 
      type = kLow; 

      break; 
     case 'H': 
      type = kHigh; 

      break; 
     case 'P': 
      type = kOpen; 
      isSpawnPoint = true; 

      break; 
     default: 
      type = kOpen; 

      break; 
     } 

     //create the tile 
     TileGrid[row][i] = new Tile(type, i, row, this); 

     if (isSpawnPoint == true) 
      _spawnPositions.push_back(TileGrid[row][i]); 
    } 
} 
+0

Я поместил некоторые переменные из общедоступных переменных в локальные переменные, поэтому не обращайте внимания на случайные переменные верхнего регистра – user819640

+0

Для TilesWide: не будет делать levelInfo.size(); просто верните размер файла? Например, вы не получили бы «5» назад, если бы это было ooooo ooooo oxxxo Вы бы получили 15? Я ошибаюсь? – user3163278

+0

Dunno dude, попробуйте :) Я не вставлял код в качестве решения, только чтобы вы шли в правильном направлении. Вам нужно будет изменить его в соответствии с вашим текстовым файлом. – user819640

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