C++按行读取文件内容,储存在数组中

本文可以用于opengl读取obj格式文件,因为最近在做三维模型的压缩和简化,所以对C++按行读取文件进行学习

//fileAddress是文件名称,特别是对于vs编辑器,文件如果不带路径需要放在  项目目录下的.cpp文件旁边,否则找不到文件
//用文件输入流读入fileAddress这个文件
//c.str()返回fileAddress第一个字符的地址
ifstream inf(fileAddress.c_str());
//记录每一行的内容
string sline;
//getline()获取inf文件中每一个以‘\n’为分割的字符串到sline中
while (getline(inf, sline, '\n'))
    {
        //可以进行判断,也可以直接读入,根据文件类型决定
        if (sline[0] == 'v')
        {
            if (sline[1] == 'n')
            {
                //istringstream类用于执行C++风格的串流的输入操作,将sline内容以空格分开成不同部分
                istringstream sin(sline);
                //按顺序将分开的内容读入s1,f2,f3,f4中,其均为string类型
                sin >> s1 >> f2 >> f3 >> f4;
                vnArr[vn_num_count][0] = f2;
                vnArr[vn_num_count][1] = f3;
                vnArr[vn_num_count][2] = f4;
                vn_num_count++;
            }
            else
            {
                istringstream sin(sline);
                sin >> s1 >> f2 >> f3 >> f4;
                vArr[v_num_count][0] = f2;
                vArr[v_num_count][1] = f3;
                vArr[v_num_count][2] = f4;
                v_num_count++;
            }
        }

因为在obj格式文件中,可能需要读入类似于“12//34”中的12和34分别储存起来,所以需要细分f2

if (sline[0] == 'f')
        {
            istringstream sin(sline);
            int a;
            sin >> s1;
            int i, k;
            //obj格式文件需要在每行读入3次“12//34”的数据
            for (i = 0; i < 3; i++)
            {
                sin >> s1;
                a = 0;
                //读入每一个字符串中第一个数据,直到遇到第一个'/'
                for (k = 0; s1[k] != '/'; k++)
                {
                //通过读入字符串中每一个字符并乘以10,达到恢复数据的目的,注意读取的数据是string类型,是ASC码类型的,因此需要减去'0',变为整形数据
                    a = a * 10 + s1[k] - '0';
                }
                fArr[f_num_count][i] = a;
                a = 0;
                //读取第二个数据,直到读到字符串结束就行,因为有两个'/',因此需要k=k+2
                for (k = k + 2; s1[k]; k++)
                {
                    a = a * 10 + s1[k] - '0';
                }
                fvArr[f_num_count][i] = a;
            }
            f_num_count++;
        }

你可能感兴趣的:(OSG,C++,opengl,c++)