Advertisement
Jakzon123

File.cpp

Jul 13th, 2023
976
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.34 KB | None | 0 0
  1. #include "File.h"
  2. #include <string>
  3. #include <fstream>
  4. #include <iostream>
  5.  
  6. // constructor
  7. File::File(std::string fileName) {
  8.     header = {};
  9.     pixelArray = nullptr;
  10.  
  11.     if (!ReadFile(fileName)) {
  12.         // file not read properly, explain error
  13.         std::cout << "File read incorrectly." << std::endl;
  14.     }
  15. }
  16.  
  17. // destructor
  18. File::~File() {
  19.     // Free dynamically allocated memory for pixelArray
  20.     if (pixelArray != nullptr) {
  21.         for (int i = 0; i < header.height; ++i) {
  22.             delete[] pixelArray[i];
  23.         }
  24.         delete[] pixelArray;
  25.     }
  26. }
  27.  
  28. // read file
  29. bool File::ReadFile(std::string fileName) {
  30.     // open file
  31.     std::ifstream file(fileName, std::ios::binary);
  32.  
  33.     if (!file.is_open()) {
  34.         std::cout << "Failed to open target file." << std::endl;
  35.         return false;
  36.     }
  37.  
  38.       // read header from file
  39.     header = readHeader(file);
  40.  
  41.     // read pixels into pixel array
  42.     pixelArray = readPixelArray(file, header.width, header.height);
  43.  
  44.     // close file
  45.     file.close();
  46.  
  47.     return true;
  48. }
  49.  
  50. // write file
  51. bool File::WriteFile(std::string fileName) {
  52.     // open file
  53.     std::ofstream file(fileName, std::ios::binary);
  54.  
  55.     if (!file.is_open()) {
  56.         std::cout << "Failed to open target file." << std::endl;
  57.         return false;
  58.     }  
  59.  
  60.     // write header to file
  61.     writeHeader(header, file);
  62.  
  63.     // write pixel array to file
  64.     writePixelArray(pixelArray, file);
  65.  
  66.     if (pixelArray == nullptr) {
  67.         return false;
  68.     }
  69.  
  70.     // close file
  71.     file.close();
  72.  
  73.     return true;
  74. }
  75.  
  76. // read header
  77. File::Header File::readHeader(std::ifstream& file) {
  78.     Header header;
  79.  
  80.     // Read each component of the header
  81.     file.read(reinterpret_cast<char*>(&header.idLength), sizeof(char));
  82.     file.read(reinterpret_cast<char*>(&header.colorMapType), sizeof(char));
  83.     file.read(reinterpret_cast<char*>(&header.dataTypeCode), sizeof(char));
  84.     file.read(reinterpret_cast<char*>(&header.colorMapOrigin), sizeof(short));
  85.     file.read(reinterpret_cast<char*>(&header.colorMapLength), sizeof(short));
  86.     file.read(reinterpret_cast<char*>(&header.colorMapDepth), sizeof(char));
  87.     file.read(reinterpret_cast<char*>(&header.xOrigin), sizeof(short));
  88.     file.read(reinterpret_cast<char*>(&header.yOrigin), sizeof(short));
  89.     file.read(reinterpret_cast<char*>(&header.width), sizeof(short));
  90.     file.read(reinterpret_cast<char*>(&header.height), sizeof(short));
  91.     file.read(reinterpret_cast<char*>(&header.bitsPerPixel), sizeof(char));
  92.     file.read(reinterpret_cast<char*>(&header.imageDescriptor), sizeof(char));
  93.  
  94.     return header;
  95. }
  96.  
  97. // write header to file
  98. void File::writeHeader(Header header, std::ofstream& file) {
  99.     // write each component of the header
  100.     file.write(reinterpret_cast<char*>(&header.idLength), sizeof(char));
  101.     file.write(reinterpret_cast<char*>(&header.colorMapType), sizeof(char));
  102.     file.write(reinterpret_cast<char*>(&header.dataTypeCode), sizeof(char));
  103.     file.write(reinterpret_cast<char*>(&header.colorMapOrigin), sizeof(short));
  104.     file.write(reinterpret_cast<char*>(&header.colorMapLength), sizeof(short));
  105.     file.write(reinterpret_cast<char*>(&header.colorMapDepth), sizeof(char));
  106.     file.write(reinterpret_cast<char*>(&header.xOrigin), sizeof(short));
  107.     file.write(reinterpret_cast<char*>(&header.yOrigin), sizeof(short));
  108.     file.write(reinterpret_cast<char*>(&header.width), sizeof(short));
  109.     file.write(reinterpret_cast<char*>(&header.height), sizeof(short));
  110.     file.write(reinterpret_cast<char*>(&header.bitsPerPixel), sizeof(char));
  111.     file.write(reinterpret_cast<char*>(&header.imageDescriptor), sizeof(char));
  112. }
  113.  
  114. File::Pixel** File::readPixelArray(std::ifstream& file, int width, int height) {
  115.     // create 2D array of pixels
  116.     Pixel** pixelArray = new Pixel*[width];
  117.  
  118.     // read pixels row as many pixels of w/h
  119.     for (int i = 0; i < width; ++i) {
  120.       pixelArray[i] = new Pixel[height];
  121.       file.read(reinterpret_cast<char*>(pixelArray[i]), sizeof(Pixel) * height);
  122.     }
  123.  
  124.     return pixelArray;
  125. }
  126.  
  127.  
  128. void File::writePixelArray(Pixel** pixelArray, std::ofstream& file) {
  129.     for (int i = 0; i < header.height; ++i) {
  130.         file.write(reinterpret_cast<char*>(pixelArray[i]), sizeof(Pixel) * header.width);
  131.     }
  132. }
  133.  
  134. File::Header File::getHeader() {
  135.     return header;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement