tuomasiyyq 2016-05-26 07:00 采纳率: 33.3%
浏览 1871
已采纳

用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

  • 写回答

2条回答 默认 最新

  • 小灸舞 2016-05-26 08:49
    关注

    读取的地方有问题,我这里换成了一行行读取,然后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;
     }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加