有时间的来帮忙看看^_^谢谢了

时间:2022-05-04 07:46:07
#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;
ifstream fin("input.dat");
fin>>map_w>>map_h;
    map=new unsigned char[map_w*map_h];
for(i=0;i<map_w*map_h;++i)fin>>map[i];
fin.close();
ofstream fout("output.dat");
for(i=0;i<map_h;++i)
{
for(j=0;j<map_w;++j)fout<<map[title_num(i,j)];
fout<<endl;
}
fout.close();
delete [] map;
system("PAUSE");
return 0;
}
这个程序从文件input.dat读取地图然后输出到output.dat文件上,编译的时候没出错,可是输出的时候老不对,帮忙看看,谢谢了,下面是读取文件
80  24
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
o-----------------------------------------------------------------------------o
o--s--------------------------------------------------------------------------o
o----------------------------oooooooooooooo-----------------------------------o
o-----------------------------------------o-----------------------------------o
ooooooooooo-------------------------------o-----------------------------------o
o---------o------ooooooo-----oooooooooooooo-------oooooooo--------------------o
o----oooooo------o-----oooo-----------------------o------o--------------------o
o----------------o--------o-----------------------ooo ooo---------------------o
o----------------oooo--oooo---------------------------------------------------o
o--------------------------------oooooooooooooooooooooooooooooooooooooooooooooo
o-----------------------------------------------------------------------------o
o-----------------------------------------------------------------------------o
o-----------------------------------------------------------------------------o
oooooooooooooooooooooooooooooooooooooooooooo----------------------------------o
o-------o-----------------------------------------------------------ooooooooooo
o-------o---ooooooo--------------------------------------oooooooo-------------o
o-------o---------o--------------------------------------o------o-------------o
o-------ooooooooooo--------oooooooooo--------------------o------o-------------o
o--------------------------oe-------ooo------------------o------o-------------o
o--------------------------ooooo------o------------------o------o-------------o
o-------------------------------------o------------------o--------------------o
o------------------------------o------o------------------o--------------------o
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo

32 个解决方案

#1


21  6
ooooooooooooooooooooo
o------ooooooo------o
o--s----------------o
o----ooooo----------o
o-------------------o
ooooooooooooooooooooo
像这么小的地图可以正常输出,可大点的地图就不行了

#2


这样的帖我喜欢...
如果学校批的话...
我就开始学游戏编程了.................
到时候大家支持..帮助

#3


map=new unsigned char[map_w*map_h];这里分配的空间太小了吧

#4


程序没出错的话我怀疑是你窗口的问题(显示范围不够,就换行显示), 你设置一下窗口的属性.

#5


不好意思, 看错了, 你是文件输出的.

#6


to:flying_dancing(小混混-_-)  是分配空间大小

我是输出到文件output.dat,应该不存在窗口问题吧

#7


UP

#8


你忽视了文件中的换行符。

#9


那要怎么改,楼上的帮忙下,还有那小地图就可以不用考虑换行符了吗

#10


要改两个地方:
1,文件打开方式要改成二进制方式,避免系统对换行符的特殊处理。
参考文章:http://www.vckbase.com/document/viewdoc/?id=1439
2,分配内存要分配文件大小而不是长乘宽

#11


好,我去看看先,多谢

#12


晕咯,改半天还是不对,谁来帮忙下,谢谢了

#13


mark

#14


主要是要处理换行符,下面ok了:

#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;
ifstream fin("input.dat");
fin>>map_w>>map_h;
    map=new unsigned char[1024*1024];

//把第一行读出不要
char* temp = new char[map_w];
fin.getline(temp,map_w);
delete[] temp;

//一行行的读
for(i=0;i<map_h;++i)fin.getline((char*)(map+i*map_w),map_w);
fin.close();
ofstream fout("output.dat");
for(i=0;i<map_h;++i)
{
for(j=0;j<map_w;++j)fout<<map[title_num(i,j)];
fout<<endl;
}
fout.close();
delete [] map;
system("PAUSE");
return 0;
}

#15


好,谢谢大家了^_^嘿嘿,
还有个问题就是为什么地图比较小的时候不考虑换行符问题,也可以正常输出,而地图大了就必须要考虑呢

#16


to: horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) 
还是不对咯,输出会有乱码

#17


呵呵....我认为没换行
存入和取出是相反的...存入之前,在文件能显示...取出也应该是一样
----
只是猜测

#18


我就是把你的地图copy过来测试的,没问题啊。

你把我的源代码copy过去试多一次

#19


不好意思咯,刚才搞错了,

#20


还有为什么小地图可以一起读,而不用一行一行的读?^_^

#21


我试怎么不对
这是结果output.dat
oooooooooooooooooooo 
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
input.dat 存的是小的地图...

#22


小地图在我写的程序里面可以正常显示

#23


to: horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) 
小地图在你的程序里面怎么不能正常显示了
oooooooooooooooooooo 
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯

#24


呵呵,我也发现了。再研究研究,io这东西是挺烦的。

#25


char* temp = new char[map_w];
fin.getline(temp,map_w);
delete[] temp;

删了,就没了..所以就不能保存了

#26


这个不是删除第一行吗,怎么大地图里面删除了就没事

#27


UP。。。。。。。。。。。。

#28


呵呵,我找到问题症结了,楼主粗心了。

在大地图中,
char str[] = "ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo";
cout<<strlen(str)<<endl;
这里输出是 79,但是你文件里说是80,
而在小地图
char str[] = "ooooooooooooooooooooo";
cout<<strlen(str)<<endl;
输出为21,文件里面也是21。

而我用getline的时候读的是每行map_w,大地图为80,但实际上为79,小地图为21,实际也是21。
因为getline是以\0为结束的,所以小地图读了第一行(没有读\0),下面是一个\0,所以后面读的都没有字符,因为这里有个\0阻塞了。
而读大地图时候,比实际读多了一个\0,下面的行就不会阻塞了。

呵呵,所以会出现这些问题了。

下面的修改过来了:

#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;

// ifstream fin("inputBig.dat");
ifstream fin("input.dat");
fin>>map_w>>map_h;
cout<<map_w<<map_h<<endl;
    map=new unsigned char[(map_w+1)*map_h];

//把第一行读出不要
char* temp = new char[map_w];
fin.getline(temp,map_w);
delete[] temp;

//一行行的读
//这里每次读 map_w + 1 个字符
for(i=0;i<map_h;++i){fin.getline((char*)(map+i*map_w),map_w+1);cout<<(map+i*map_w)<<endl;}

fin.close();
ofstream fout("output.dat");
for(i=0;i<map_h;++i)
{
for(j=0;j<map_w;++j)fout<<map[title_num(i,j)];
//fout.write((char*)(map+i*map_w),map_w);
fout<<endl;
}
fout.close();
delete [] map;
system("PAUSE");
return 0;
}

#29


每次读的时候要比实际的字符多读一个。
fin.getline((char*)(map+i*map_w),map_w+1);

所以分配空间应该为:
map=new unsigned char[(map_w+1)*map_h];

#30


哦,懂了,是我粗心了,谢谢你了horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) ^_^

#31


好样的........

#32


#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;

ifstream fin("input.dat");
fin>>map_w>>map_h;
cout<<map_w<<map_h<<endl;
char *s=new char [1024*1024];
int k=0;
while(fin.get(s[k++]))
s[k]='\0';
cout<<s<<endl;
fin.close();

system("PAUSE");
return 0;
}////////做游戏不能直接读和存吗???有必要这样吗??

#1


21  6
ooooooooooooooooooooo
o------ooooooo------o
o--s----------------o
o----ooooo----------o
o-------------------o
ooooooooooooooooooooo
像这么小的地图可以正常输出,可大点的地图就不行了

#2


这样的帖我喜欢...
如果学校批的话...
我就开始学游戏编程了.................
到时候大家支持..帮助

#3


map=new unsigned char[map_w*map_h];这里分配的空间太小了吧

#4


程序没出错的话我怀疑是你窗口的问题(显示范围不够,就换行显示), 你设置一下窗口的属性.

#5


不好意思, 看错了, 你是文件输出的.

#6


to:flying_dancing(小混混-_-)  是分配空间大小

我是输出到文件output.dat,应该不存在窗口问题吧

#7


UP

#8


你忽视了文件中的换行符。

#9


那要怎么改,楼上的帮忙下,还有那小地图就可以不用考虑换行符了吗

#10


要改两个地方:
1,文件打开方式要改成二进制方式,避免系统对换行符的特殊处理。
参考文章:http://www.vckbase.com/document/viewdoc/?id=1439
2,分配内存要分配文件大小而不是长乘宽

#11


好,我去看看先,多谢

#12


晕咯,改半天还是不对,谁来帮忙下,谢谢了

#13


mark

#14


主要是要处理换行符,下面ok了:

#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;
ifstream fin("input.dat");
fin>>map_w>>map_h;
    map=new unsigned char[1024*1024];

//把第一行读出不要
char* temp = new char[map_w];
fin.getline(temp,map_w);
delete[] temp;

//一行行的读
for(i=0;i<map_h;++i)fin.getline((char*)(map+i*map_w),map_w);
fin.close();
ofstream fout("output.dat");
for(i=0;i<map_h;++i)
{
for(j=0;j<map_w;++j)fout<<map[title_num(i,j)];
fout<<endl;
}
fout.close();
delete [] map;
system("PAUSE");
return 0;
}

#15


好,谢谢大家了^_^嘿嘿,
还有个问题就是为什么地图比较小的时候不考虑换行符问题,也可以正常输出,而地图大了就必须要考虑呢

#16


to: horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) 
还是不对咯,输出会有乱码

#17


呵呵....我认为没换行
存入和取出是相反的...存入之前,在文件能显示...取出也应该是一样
----
只是猜测

#18


我就是把你的地图copy过来测试的,没问题啊。

你把我的源代码copy过去试多一次

#19


不好意思咯,刚才搞错了,

#20


还有为什么小地图可以一起读,而不用一行一行的读?^_^

#21


我试怎么不对
这是结果output.dat
oooooooooooooooooooo 
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
input.dat 存的是小的地图...

#22


小地图在我写的程序里面可以正常显示

#23


to: horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) 
小地图在你的程序里面怎么不能正常显示了
oooooooooooooooooooo 
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯
 屯屯屯屯屯屯屯屯屯屯

#24


呵呵,我也发现了。再研究研究,io这东西是挺烦的。

#25


char* temp = new char[map_w];
fin.getline(temp,map_w);
delete[] temp;

删了,就没了..所以就不能保存了

#26


这个不是删除第一行吗,怎么大地图里面删除了就没事

#27


UP。。。。。。。。。。。。

#28


呵呵,我找到问题症结了,楼主粗心了。

在大地图中,
char str[] = "ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo";
cout<<strlen(str)<<endl;
这里输出是 79,但是你文件里说是80,
而在小地图
char str[] = "ooooooooooooooooooooo";
cout<<strlen(str)<<endl;
输出为21,文件里面也是21。

而我用getline的时候读的是每行map_w,大地图为80,但实际上为79,小地图为21,实际也是21。
因为getline是以\0为结束的,所以小地图读了第一行(没有读\0),下面是一个\0,所以后面读的都没有字符,因为这里有个\0阻塞了。
而读大地图时候,比实际读多了一个\0,下面的行就不会阻塞了。

呵呵,所以会出现这些问题了。

下面的修改过来了:

#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;

// ifstream fin("inputBig.dat");
ifstream fin("input.dat");
fin>>map_w>>map_h;
cout<<map_w<<map_h<<endl;
    map=new unsigned char[(map_w+1)*map_h];

//把第一行读出不要
char* temp = new char[map_w];
fin.getline(temp,map_w);
delete[] temp;

//一行行的读
//这里每次读 map_w + 1 个字符
for(i=0;i<map_h;++i){fin.getline((char*)(map+i*map_w),map_w+1);cout<<(map+i*map_w)<<endl;}

fin.close();
ofstream fout("output.dat");
for(i=0;i<map_h;++i)
{
for(j=0;j<map_w;++j)fout<<map[title_num(i,j)];
//fout.write((char*)(map+i*map_w),map_w);
fout<<endl;
}
fout.close();
delete [] map;
system("PAUSE");
return 0;
}

#29


每次读的时候要比实际的字符多读一个。
fin.getline((char*)(map+i*map_w),map_w+1);

所以分配空间应该为:
map=new unsigned char[(map_w+1)*map_h];

#30


哦,懂了,是我粗心了,谢谢你了horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) ^_^

#31


好样的........

#32


#include<iostream>
#include<fstream>
using namespace std;
int map_w,map_h;  //地图宽度,高度
unsigned char*map;
int title_num(int x,int y){return x*map_w+y;}//将 x,y 坐标转换为地图上块的编号
int title_x(int n){return n/map_w;}//由块编号得出 x,y 坐标
int title_y(int n){return n%map_w;}
int main()
{
int i,j;

ifstream fin("input.dat");
fin>>map_w>>map_h;
cout<<map_w<<map_h<<endl;
char *s=new char [1024*1024];
int k=0;
while(fin.get(s[k++]))
s[k]='\0';
cout<<s<<endl;
fin.close();

system("PAUSE");
return 0;
}////////做游戏不能直接读和存吗???有必要这样吗??