istream :: читать неправильно заполненный массив символов - PullRequest
1 голос
/ 01 марта 2012

Я открываю istream для двоичного чтения:

ifstream file;
file.open (this -> fileName.c_str(), ios::binary);

Затем я пытаюсь прочитать, пока файл исправен, в указатель массива char:выход отличается для каждого из вышеперечисленных.Sizeof () производит 4, который является правильным размером указателя на символ.gcount () создает любое значение, которое имеет numberOfBytes.Однако strlen () возвращает другое, меньшее число.Итак, хотя read () переместил указатель istream numberOfBytes, у меня нет этих байтов в массиве char.Я хочу, чтобы все эти байты в массиве char.Как мне этого добиться?Что происходит?

Ответы [ 5 ]

4 голосов
/ 01 марта 2012

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

Способ, которым strlen () вычисляет размер строки, начинается с начала строки и считается до тех пор, пока она не достигнет нулевого символа.

Таким образом, strlen () будет сообщать только количество байтов до нулевого символа, а не фактическое число прочитанных байтов.

3 голосов
/ 01 марта 2012

Попробуйте это:

Я могу только догадываться, что вы не инициализировали numberOfBytes. Я только что скопировал и распечатал, у меня работает:

//file test.C
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

int main() {

    ifstream file;
    file.open ("test.C", ios::binary);
    char data[1024];
    char *p = data;
    file.read(p, 1024);
    cout << "size: "   << sizeof(p)     << endl;
    cout << "gcount: " << file.gcount() << endl;
    cout << "strlen: " << strlen(p)     << endl;
    cout << "data: " << p << endl;

    return 0;
}
2 голосов
/ 01 марта 2012

Функция strlen считает количество байтов, пока не найдет нулевой байт. Может ли быть так, что данные содержат не все печатные символы?

2 голосов
/ 01 марта 2012

strlen сообщает количество байтов до, но не включая первый нуль-байт.

1 голос
/ 01 марта 2012

В вашей двоичной строке может быть эквивалент EOF или NULL, что вызывает проблемы с strlen.

...