Ifstream从文本文件中获取信息

时间:2010-11-30 14:46:57

标签: c++ ifstream

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

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();
 }

当我构建此代码时,我怎么会收到以下错误:

  

binary'==':没有运营商找到哪个   采用类型

的右侧操作数

然后,如果我将双等号更改为单个,我会收到以下错误:

  

错误C2451:条件表达式   类型'std :: basic_string< _Elem,_Traits,_Ax>'是非法的   'char'(或者没有可接受的   转化率)

我是否遗漏了导致错误的内容?


抱歉我缺乏适当的细节。

谢谢chaosTechnician。 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 个答案:

答案 0 :(得分:3)

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

line == '0'

相反,请尝试:

line[0] == '0'

或:

line == "0"

答案 1 :(得分:1)

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

如果您的文字文件是0,0,0,0,0,0,0,0,0,0(一行中的所有内容),则getline(myfile, line);会在您第一次阅读时将其全部读完 - 它全部在一行上。 Here's a link to how getline() works。如果您使用逗号作为分隔符(通过将逗号作为第三个参数传递: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

希望这有帮助。

答案 2 :(得分:0)

要扩展chaosTechnician,请回答ifstream没有看到行。

每次调用myfile时,无论其位置如何,都会读取下一个值。

这意味着它将读取0 0 0 0和 0 0 0 0

同样的事情。

我在代码中使用它的方法是在diffident行上放置不同的数据,例如

50 //比赛长度 0 0 0 //每个车道的第一个方格
0 1 0 //第二道等等

但如果是的话它的功能完全相同 50 0 0 0 0 1 0

通过了解信息的读取顺序,您可以在加载时将其读入变量并在游戏进行时对其进行操作。

祝你的项目好运

编辑:

我使用c ++和directx 9.c,所以这个方法适合你。

答案 3 :(得分:0)

如果您担心保持相对空间数据(即每个'tile'的行/列)完好无损并且您将自己限制为ascii文件,那么您可能只是放弃分隔或读取无效输入的任何问题切换到字符。

我们说这是你的文件:

a6sgb1
dsj26s
l8h9h4
34gpoy

然后执行以下操作来解析它(在测试从std::getline()std::stringstreamstd::get()读取一行后,只需从std::string进行简单的迭代{1}}在我的开发机器上,我发现第一个最快 - 你的里程可能会有所不同。我将提供所有这三个):

字符串流

std::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;
}

其他人提到这样的问题可能应该在stackoverflow,我同意。