Ifstream получает информацию из текстового файла - PullRequest
0 голосов
/ 30 ноября 2010

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

0, 0, 1, 1, 1, 1, 0, 0

0, 1, 0, 0, 0, 0, 1, 0

0, 0, 1, 1, 1, 1, 0, 0

Сама земля - ​​это просто сетка.

На данный момент код, который я должен получить информацию из текстового файла, выглядит следующим образом:

 string line;
 ifstream myfile ("track1.txt");
 if (myfile.is_open())
 {
  while ( !myfile.eof() )
  {
   getline( myfile, line, ',');
   if (line == '0')
   {
    const wstring textureFileName=TEXT("crate.jpg");
   }
   myfile>>line;
  }


  myfile.close();
 }

Когда я строю этот код, как только я получаю следующую ошибку:

бинарный '==': оператор не найден, который принимает правый операнд типа

Тогда, если я заменю знак двойного равенства на один, я получаю следующую ошибку:

ошибка C2451: условное выражение типа 'std :: basic_string <_Elem, _Traits, _Ax>' недопустимо 'char' (или нет приемлемого преобразование)

Я что-то упускаю из-за ошибки?


Извините за недостаток деталей.

Спасибо, хаос, техник. Будет ли val работать с несколькими строками в текстовом файле? Как это

0 0 1 1 1 1 0 0
0 1 0 0 0 0 1 0
1 0 0 0 0 0 0 1
0 1 0 0 0 0 1 0
0 0 1 1 1 1 0 0

Я имею в виду, нужно ли что-нибудь еще печатать, чтобы компьютер понял, что линия закончилась?

Ответы [ 4 ]

3 голосов
/ 30 ноября 2010

Вы пытаетесь сравнить строку с символом:

line == '0'

вместо этого попробуйте:

line[0] == '0'

или

line == "0"
1 голос
/ 27 ноября 2010

Во-первых, я настоятельно рекомендую использовать форматирование кода в вашем посте, чтобы его было легче читать ... Кроме того, самый простой способ проверить правильность написанного - это скомпилировать и запустить его.:)

Если ваш текстовый файл 0,0,0,0,0,0,0,0,0,0 (все в одной строке), то getline(myfile, line); прочитает все это при первом чтении - все в одной строке. Вот ссылка на то, как getline() работает .Если бы вы использовали запятую в качестве разделителя (передавая запятую в качестве третьего аргумента: getline(myfile, line, ',');), то гораздо больше шансов сделать то, что вы хотите.Но если вы хотите просто прочитать каждую строку, зачем помещать их в одну строку, разделенную запятой, если вы можете просто поместить каждую строку в отдельную строку?Есть ли конкретная причина, по которой вы делаете это таким образом?

Кроме того, если line - строка, if(line == 0) не будет проверять то, что вы хотите, чтобы она проверила.Вам нужно преобразовать line в int для сравнения значений.

Если вы хотите использовать ifstream и значения в файле будут целыми числами, я бы предложил что-то похожее наэто:

int val;
ifstream myfile("track1.txt");
while(myfile >> val)
{
    //Use the value in here
}

Тогда ваш файл может быть таким простым:

0 0 0 0 0 0 0 0 0 0

Надеюсь, это поможет.

0 голосов
/ 07 апреля 2011

Если вас беспокоит сохранение относительных пространственных данных (т. Е. Строк / столбцов каждой «плитки») нетронутыми и вы ограничиваете себя файлами ascii, вы можете просто отказаться от каких-либо проблем с разделением или чтением неверного вводапереключившись на chars.

Допустим, это ваш файл:

a6sgb1
dsj26s
l8h9h4
34gpoy

А затем выполните следующее для его анализа (после проверки чтения строки от std::getline() до std::stringstream, std::get(), и, просто выполняя итерацию по std::string из std::getline() на моей машине для разработки, я обнаружил, что первое будет самым быстрым - ваш пробег может отличаться. Я предоставлю все три):

stringstream

ifstream strFile("test.txt");
string line;
int row(0);
int col(0);
while(getline(strFile, line)) {
  stringstream ss(line);
  char ch;
  while(ss >> ch) {
    switch(ch) {
      // your code
    }
    ++col;
  }
  ++row;
}

итерация строки

istream lineFile("test.txt");
string line;
int row(0);
while(getline(lineFile, line)) {
  int len(line.length());
  for(int col = 0; col < len; ++col) {
    switch(line[col]) {
      // your code
    }
  }
  ++row;
}

разбор отдельных символов

ifstream chFile("test.txt");
char ch;
int row(0);
int col(0);
while(chFile.get(ch)) {
  switch(ch) {
    case '\n': 
      ++row;
      break;
    // your code
  }
  ++col;
}

Кто-то еще упомянул подобные вопросы, вероятно, должен быть на stackoverflow Я согласен.

0 голосов
/ 07 апреля 2011

Чтобы раскрыть хаосТехник, ответьте, если поток не видит строк.

каждый раз, когда вы вызываете myfile, он будет читать следующее значение независимо от его местоположения.

это означает, что он будет читать 0 0 0 0 и 0 0 0 0

как то же самое.

способ, которым я использую это в своем коде, состоит в том, чтобы поместить разные данные в нечеткие линии, например

50 // длина гонки 0 0 0 // первый квадрат каждой полосы
0 1 0 // вторая полоса и т. Д.

но он бы работал точно так же, если бы 50 0 0 0 0 1 0

Зная, в каком порядке будет читаться информация, вы можете читать ее в переменные во время загрузки и манипулировать ими по ходу игры.

Удачи в вашем проекте

редактирование:

Я использую C ++, DirectX 9.C, поэтому этот метод должен работать для вас.

...