проблема при чтении двоичного файла (смесь ascii и двоичного файла) - PullRequest
3 голосов
/ 30 марта 2011

Мой код для чтения двоичного файла:

dataFile.open(fileName.c_str());
ifstream binData("Trafficlog_Data.txt", ios::in | ios::binary);  //binary data file 
if(!binData) { 
  cout << "Cannot open file.\n"; 
  return -1; 
} 
char *memblock;int nBytes =12;
memblock = new char [nBytes+1];
binData.read(memblock,nBytes);
memblock[nBytes+1]='\0';
std::string message;message.assign(memblock,nBytes);
printf("%s\n",message.c_str());

Теперь я дал в качестве входных данных файл, содержащий двоичные данные и данные ascii
RFB 003.003
RFB 003.003
- иногдадвоичные данные -

Когда я читаю первые 12 байтов файла, который является "RFB 003.003 \ n", но он печатает "RFB 003.003 =".Может кто-нибудь сказать, где я ошибаюсь, пожалуйста.проблема не с '\ 0'.Проблема в том, что он не читает «RFB 003.003 \ n».Это потому, что этот файл представляет собой смесь двоичных данных и данных ascii

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

Вы не выделили память для блокировки:

char *memblock = new char[nBytes+1];
1 голос
/ 30 марта 2011

Изменение:

memblock[nBytes+1]='\0';

до:

memblock[nBytes]='\0';

Допустим, вы прочитали шесть байтов до memblock, которое переходит в позиции от 0 до 5 включительно:

  0   1   2   3   4   5    6    7
+---+---+---+---+---+----+---+---+
| H | E | L | L | O | \n | ? | ? |
+---+---+---+---+---+----+---+---+

(области ? все еще содержат мусор, который был там раньше).

Затем вам нужно поместить нулевой терминатор в позицию 6, а не в позицию 7, как это делает ваш код.

Поместив нулевой терминатор слишком далеко вправо, вы включаете первую ? позицию, которая может содержать что угодно.


Вот что является причиной вашей конкретной проблемы. У вас также есть проблема, связанная с тем, что вы не выделяете место для хранения данных, которые вы читаете. У вас просто есть char *, но вы на самом деле не инициализируете его, чтобы указать на полезную память. Это почти наверняка вызовет проблемы.

Вероятно, самое простое решение - определить его как:

char memblock[nBytes+1];

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

0 голосов
/ 30 марта 2011

Вы отключены: просто сделайте memblock[nBytes]='\0'; Индекс начинается с 0, поэтому, если nBytes равно 0, вы пишете на первой позиции, если nBytes равно 1, то вы пишетевторая позиция и тд.Выполнив nBytes + 1, вы фактически прыгнули вперед на одну позицию и оставили один байт мусора в конце строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...