我有一个带有ASCII字符的.dat文件,如下图所示:
它基本上是一系列16位数字。我可以在我的数据结构中读取它,作为unsigned short,但我不知道如何将unsigned short保存为与输入相同的格式。这是我当前的代码,虽然值是正确的,但格式不是。见下图:
任何人都知道我应该如何保存它与输入格式相同?这是我的保存功能“
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;
}
答案 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)
两件事:
您没有以二进制模式打开流。试试这个:
ofstream os(fileName, ios::out | ios::binary);
实际上,因为ofstream
会自动设置ios::out
标记,所以您只需要这样:
ofstream os(fileName, ios::binary);
另一个问题是您正在呼叫std::endl
。这将输出\n
,然后刷新流。
os << pxl << endl;
将上述内容更改为:
os << pxl;
答案 2 :(得分:1)
取代
os << pxl << endl;
你可以把
os.write((char*)&pxl, sizeof(pxl));
将pxl的原始字节写入文件而不是ASCII表示。请记住,无符号短路的字节顺序和字大小可能因系统而异。