Почему этот поток данных заканчивается байтом 26? - PullRequest
2 голосов
/ 07 июня 2011

Я все еще работаю над проблемой ввода / вывода с битовой картой неделю назад.Я снова застрял, поэтому я решил начать с того типа ввода / вывода, с которым я был знаком, и сделать его более похожим на то, что мне нужно, - постоянно проверять каждый байт (пиксель) и выводить в файл на основе этого.значение байта).

Я начал с программы, которая считывала и проверяла каждый символ текстового файла, выводила «Z», если он был выше некоторого порога, и выводила «A», если он был ниже.

Эта программа работала отлично, поэтому я решил изменить ее с символов на байты в файле.

Теперь у меня проблемы с этим.Первые 26 (байты 0-25) байтов файла являются правильными, но остальные - 0 или -1, в зависимости от того, что я использую ifstream.get() или ifstream.read.

Входной файл Input.FILE был создан в шестнадцатеричном редакторе и содержит только 0x00-0xFF.Длина - 256 байт.

Код:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
   ifstream sourcefile;
   ofstream output;
   ofstream output2;

   output.open("output.txt");
   output2.open("messages.txt");
   sourcefile.open("Input.FILE");

   vector<char> data(256);
   sourcefile.read(&data[0],256);
   sourcefile.seekg(0,ios::beg);

   for(int i = (int) 0x00 ; i < data.size() ; i++)
   {
      output2 << "Value data[" << i << "] = " << (int) data[i] << endl;

      if((int)data[i] < 0)
      {
         // since I can't make an unsigned char vector, I use this to convert
         // it to the correct number. Could this be the problem?
         data[i] = 256 + data[i];
         output2 << "less than zero." << endl;
      }

      if(data[i] > 64)
      {
         data[i] = 0xFF;
         output2 << "greater than 64, set to 0xFF." << endl;
      }
      else if(data[i] < 64)
      {
         data[i] = 0x00;
         output2 << "less than 64, set to 0x00." << endl;
      }
      else
      {
         // This is most likely pointless, but I didn't want to take a chance
         data[i] = 0x75;
         output2 << "neither greater nor less than 64? Set to 0x75." << endl;
      }

      output2 << endl;
   }

   output.write(&data[0],256);
}

Вывод (от message.txt):

Примечание: data[0-25] содержит правильные значения

...
Данные значений [19] = 19 меньше 64, установлены на 0x00.
Данные значений [20] = 20 меньше64, значение 0x00.
Данные значения [21] = 21 меньше 64, значение 0x00.
Данные значения [22] = 22 меньше 64, значение 0x00.
Данные значения [23]= 23 меньше 64, значение 0x00.
Данные значения [24] = 24 меньше 64, значение 0x00.
Данные значения [25] = 25 меньше 64, значение 0x00.
значениеданные [26] = 0 меньше 64, установлено на 0x00.

Ответы [ 4 ]

8 голосов
/ 07 июня 2011

Откройте ваш поток в двоичном режиме:

sourcefile.open("Input.FILE", ios::binary);
6 голосов
/ 07 июня 2011

Если вы посмотрите, что код 25 ascii является , вы увидите, что это означает end of medium, поэтому есть большая вероятность, что если вы читаете в режиме ascii, любые последующие операции чтения не будутработа.

Попробуйте указать, что вы используете двоичный файл:

sourcefile.open("Input.FILE", ios::binary);
5 голосов
/ 07 июня 2011

Попробуйте sourcefile.open("Input.FILE", std::ifstream::binary).

4 голосов
/ 07 июня 2011

Возможно, вы 1) используете архаичную ОС (например, CP / M или DOS), в которой in-line control-Z представляет EOF, и 2) не открываете файл в двоичном режиме.

Попробуйте sourcefile.open("Input.FILE", ios::binary);.

...