.dat C ++中的ASCII文件I / O.

时间:2014-02-17 23:28:11

标签: c++ file file-io ascii

我有一个带有ASCII字符的.dat文件,如下图所示:

enter image description here

它基本上是一系列16位数字。我可以在我的数据结构中读取它,作为unsigned short,但我不知道如何将unsigned short保存为与输入相同的格式。这是我当前的代码,虽然值是正确的,但格式不是。见下图:

enter image description here

任何人都知道我应该如何保存它与输入格式相同?这是我的保存功能“

void SavePxlShort(vector<Point3D> &pts, char * fileName)
{
    ofstream os(fileName, ios::out);

    size_t L = pts.size();
    cout << "writing data (pixel as short) with length "<< L << " ......" << endl;

    unsigned short pxl;
    for (long i = 0; i < L; i++)
    {
        pxl = Round(pts[i].val());
        if (pts[i].val() < USHRT_MAX)
        {
            os <<  pxl << endl;
        }
        else
        {
            cout << "pixel intensity overflow ushort" << endl;
            return;
        }
    }

    os.close();

    return;
}

3 个答案:

答案 0 :(得分:2)

void SavePxlShort(vector<Point3D> &pts, char * fileName)
{
    ofstream os(fileName, ios::out, ios::binary);

    size_t L = pts.size();
    cout << "writing data (pixel as short) with length "<< L << " ......" << endl;

    unsigned short* pData = new unsigned short[L];
    unsigned short pxl;
    for (long i = 0; i < L; i++)
    {
        pxl = pts[i].val();
        if (pts[i].val() < USHRT_MAX)
        {
            pData[i] = pxl ;
        }
        else
        {
            cout << "pixel intensity overflow ushort" << endl;
            return;
        }
    }

    os.write(reinterpret_cast<char*> (pData), sizeof(unsigned short)*L);
    os.close();

    delete pData;

    return;
}

答案 1 :(得分:1)

两件事:

  1. 您没有以二进制模式打开流。试试这个:

    ofstream os(fileName, ios::out | ios::binary);
    

    实际上,因为ofstream会自动设置ios::out标记,所以您只需要这样:

    ofstream os(fileName, ios::binary);
    
  2. 另一个问题是您正在呼叫std::endl。这将输出\n,然后刷新流。

    os <<  pxl << endl;
    

    将上述内容更改为:

    os <<  pxl;
    

答案 2 :(得分:1)

取代

os << pxl << endl;

你可以把

os.write((char*)&pxl, sizeof(pxl));

将pxl的原始字节写入文件而不是ASCII表示。请记住,无符号短路的字节顺序和字大小可能因系统而异。