0

目前,我正在尝试创建一个赛道,该赛道通过文本文件加载了地面上的所有纹理。一个例子是这样的:

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

4 回答 4

3

您正在尝试将字符串与 char 进行比较:

line == '0'

相反,尝试:

line[0] == '0'

或者:

line == "0"
于 2010-11-30T14:53:50.773 回答
1

首先,我强烈建议在您的帖子中使用代码格式以使其更易于阅读......此外,查看它是否正确编写的最简单方法是编译并运行它。:)

如果您的文本文件是0,0,0,0,0,0,0,0,0,0(所有内容都在一行上),那么getline(myfile, line);将在您第一次阅读时将其全部读入——全部在一行上。 这是如何getline()工作的链接。如果您要使用逗号作为分隔符(通过将逗号作为第三个参数传递:),getline(myfile, line, ',');则更有可能做您想做的事。但是,如果您只想阅读每一行,为什么将它们放在同一行并用逗号分隔,而您可以将它们放在单独的行上呢?你这样做有什么特别的原因吗?

此外,如果line是字符串,if(line == 0)则不会检查您希望它检查的内容。您需要转换line为 aint来比较值。

如果您想使用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

希望这可以帮助。

于 2010-11-27T18:03:22.597 回答
0

为了扩展chaosTechnician的回答,ifstream没有看到线条。

每次调用 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,所以这个方法应该适合你。

于 2011-04-07T12:14:39.803 回答
0

如果您担心保持相对空间数据(即每个“平铺”的行/列)完整,并且您将自己限制在 ascii 文件中,那么您不妨通过切换到来放弃任何定界或读取无效输入的问题字符。

假设这是您的文件:

a6sgb1
dsj26s
l8h9h4
34gpoy

然后执行以下操作来解析它(在测试从std::getline()through读取一行std::stringstreamstd::get()并且只是简单地遍历我的开发机器上的std::stringfromstd::getline()之后,我发现第一个最快 - 你的里程可能会有所不同。我将提供所有三个):

串流

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上,我同意。

于 2011-04-07T15:14:02.747 回答