2014-02-17 2 views
2

У меня есть .dat файл с ASCII-символов, как следующая картина:.dat ASCII файл ввода/вывода в C++

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; 
} 
+0

Определение ASCII охватывает только 7 бит, поэтому как вы можете использовать 16-битный блок и отображать его в ASCII? –

ответ

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; 
} 
+0

Утечка памяти. Где вы удаляете 'pData'? –

+0

Извините, вы правы. удалить pData. –

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; 
    
+0

Это выводит текстовое представление значения, а не двоичного. – dreamlax

1

вместо

os << pxl << endl; 

Вы можете поместить

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

писать необработанные байты s pxl в файл вместо представления ASCII. Помните, что порядок байтов и размер слова без знака могут различаться между системами.

Смежные вопросы