用C++写入一个文件容易,然后输出到屏幕上,但是一堆乱码,我的代码里面写错了吗?

#ifndef OBJ_H
#define OBJ_H
#include
#include
class obj
{
public:
struct Vertex
{
float x, y, z;
};
struct Face
{
int f1, f2, f3, f4;
};
void input(char *);
friend std::ostream & operator<<(std::ostream & os,const obj & ob);
obj();
~obj();
typedef std::vector Ve;
typedef std::vector Fa;
private:
Ve ve;
Fa fa;
};
#endif // !OBJ_VIEW_CLASS_H
#include"obj.h"
#include
#include
#include
obj::obj()
{}
obj::~obj()
{}
void obj::input(char * FileName)
{
std::ifstream in(FileName);
if (!in) return;
std::string s;
while (in >> s)
{
switch (*s.c_str())
{

         case 'v':
            {
                Vertex v;
                in >> v.x >> v.y >> v.z;
                ve.push_back(v);
            }
         case 'f':
            {
                Face f;
                in >> f.f1 >> f.f2 >> f.f3 >> f.f4;
                fa.push_back(f);
            }
     }

 }

}

std::ostream & operator<<(std::ostream & os,const obj & ob)
{
for (unsigned int i = 0; i < ob.ve.size(); i++) os << ob.ve[i].x << ob.ve[i].y << ob.ve[i].z;
for (unsigned int i = 0; i < ob.fa.size(); i++) os << ob.fa[i].f1 << ob.fa[i].f2 << ob.fa[i].f3 << ob.fa[i].f4;
return os;
}
int main()
{

 obj ob;
 ob.input("basic model.obj");
 std::cout << ob;
 getchar();
 return 0;

}
最后的输出是-1.07374e+08-1.07374e+08-1.07374e+08-858993460-858993460-858993460-858993460

读取的地方有问题,我这里换成了一行行读取,然后sscanf格式化提取

 #include"obj.h"
#include<fstream>
#include<string>
#include<iostream>
 obj::obj()
 {}
 obj::~obj()
 {}
 void obj::input(char * FileName)
 {
     std::ifstream in(FileName);
     if (!in) return;
     char buff[1024] = {0};
     while (in.getline(buff, 1024))
     {
         switch (buff[0])
         {     
             case 'v':
                {
                    Vertex v;
                    sscanf(buff, "v %f %f %f", &v.x, &v.y, &v.z);
                    //in >> v.x >> v.y >> v.z;
                    ve.push_back(v);
                    break;
                }
             case 'f':
                {
                    Face f;
                    sscanf(buff, "f %d %d %d %d", &f.f1, &f.f2, &f.f3, &f.f4);
                    //in >> f.f1 >> f.f2 >> f.f3 >> f.f4;
                    fa.push_back(f);
                    break;
                }
         }

     }
 }

 std::ostream & operator<<(std::ostream & os,const obj & ob)
 {
     for (unsigned int i = 0; i < ob.ve.size(); i++) os << ob.ve[i].x << " " << ob.ve[i].y << " " <<ob.ve[i].z << std::endl;
     for (unsigned int i = 0; i < ob.fa.size(); i++) os << ob.fa[i].f1 << " " <<ob.fa[i].f2 << " " <<ob.fa[i].f3 << " " <<ob.fa[i].f4 << std::endl;
     return os;
 }
 int main()
 {

     obj ob;
     ob.input("basic model.obj");
     std::cout << ob;
     getchar();
     return 0;
 }

basic model.obj文件的部分内容是:

3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware

创建的文件:06.01.2013 15:56:20

mtllib 人体基本模型.mtl

#

object ____________013

#

v 8.206177 149.575684 7.019145
v 13.651268 155.530914 -1.473303
v 17.910635 167.460831 -15.258268
v 17.261469 137.524384 9.521211
v 21.630640 164.190140 -17.363892
v 17.344156 146.340393 -0.580418
v 53.766506 105.189636 5.919157
v 52.537846 98.139229 -17.698259
v 45.180187 96.170189 -34.722229
v 32.851185 54.406116 -25.581568
v 39.707863 60.869682 -10.158324
v 38.343487 62.783382 15.084597
v 27.307192 69.703369 32.602215
v 46.473713 151.184769 -26.991053
v 49.092541 145.877335 -8.915635
v 55.945309 125.678093 2.675766
v 61.115013 107.912086 -10.903605
v 59.585373 106.927902 -25.550871
v 51.888321 113.080612 -36.462933

11197 vertices

g ____________013
usemtl _____________default
f 2794 1 2791 2795
f 2795 2791 697 2792
f 701 2793 2795 2792
f 2793 700 2794 2795
f 2792 697 2796 2799
f 2799 2796 322 2797
f 2798 2799 2797 698
f 701 2792 2799 2798
f 2802 701 2798 2803
f 2803 2798 698 2800
f 2801 2803 2800 325
f 2801 699 2802 2803
f 2806 2805 700 2793
f 2802 2806 2793 701
f 699 2804 2806 2802
f 2804 4 2805 2806
f 2810 2 2807 2811
f 2133 8407 8423 8425
f 8423 8422 8425
f 8425 8424 8430 8426
f 2133 8425 8426 8408
f 8369 8408 8426 8370
f 8426 2139 8427 8434
f 8427 8435 8434