Я пытался читать / писать с помощью моей программы (c ++) файл .tga в виде двоичного файла, но созданный файл все еще был поврежден.Код ниже.
std::string name = "my_picture.tga";
std::ifstream FileIn(name, std::ios_base::binary);
std::vector<char> listChar;
bool stopp = false;
if (FileIn) {
while (!(stopp))
{
char xin;
FileIn.read(reinterpret_cast<char*>(&xin), sizeof(char));
listChar.push_back(xin);
if (FileIn.eof()) stopp = true;
}
FileIn.close();
}
std::ofstream FileOut(".\\test.tga", std::ios_base::binary);
bool isCarierReturn = false;
for (char xout : listChar) {
isCarierReturn = xout == '\r';
if (!isCarierReturn) FileOut.write(reinterpret_cast<const char*>(&xout), sizeof(char));
}
FileOut.close();
Я сравнил исходный файл с новым в шестнадцатеричном считывателе, и файлы фактически отличаются.
Разница между исходным и новым файлом состоит в несоответствии строк, заканчивающихся вместо того, чтобы просто иметь 0x0A ('\ n') в исходном файле, новый файл имел последовательность байтов 0x0D 0x0A ('\ r' и н').На некоторых других изображениях сгенерированный файл был неполным, разрыв всегда предшествует значению 0x1A (как сказал @Christoph Lipka).
Мне удается написать правильную последовательность, проверив, является ли char возвращением носителя,В этом случае char не записывается и пропускается только байт 0x0D, см. ниже:
std::ofstream FileOut(".\\test.tga", std::ios_base::binary);
bool isCarrierReturn = false;
char xout_p1 = '\0';
if (listChar.size() >= 1) xout_p1 = listChar.at(0);
for (unsigned i(0); i < listChar.size(); i++) {
char xout = xout_p1;
if (i < listChar.size() - 1) xout_p1 = listChar.at(i + 1);
else xout_p1 = '\0';
isCarrierReturn = xout == '\r' && xout_p1 == '\n';
if (!isCarrierReturn) FileOut.write(reinterpret_cast<const char*>(&xout), sizeof(char));
}
FileOut.close();
Неполное чтение файла решается чтением файла как двоичного файла.
Это работает.