目前我正在尝试创建一个通过文本文件加载地面上所有纹理的赛道。一个例子是:
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
我的意思是,还有什么我需要输入才能让计算机意识到线已经结束了吗?
答案 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::stringstream
,std::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,我同意。