MS Visual C ++ 2008 символьный буфер длиннее, чем определено - PullRequest
1 голос
/ 18 июля 2010

У меня есть буфер char * для хранения файла, который я читаю в двоичном режиме. Я знаю, что длина файла составляет 70 байт, и это значение используется для создания буфера правильного размера. Проблема в том, что в массиве есть 17 или 18 лишних пробелов, поэтому некоторые случайные символы добавляются в конец. Может ли быть проблема с Unicode?

ulFLen хранит размер файла в байтах и ​​имеет правильное значение (70 для файла, на котором я тестирую)

//Set up a buffer to store the file
pcfBuffer = new char[ulFLen];

//Reading the file
cout<<"Inputting File...";
fStream.seekg(0,ios::beg);
fStream.read(pcfBuffer,ulFLen);
if(!fStream.good()){cout<<"FAILED"<<endl;}else{cout<<"SUCCESS"<<endl;}

Ответы [ 2 ]

1 голос
/ 18 июля 2010

Поскольку это массив char, вы, вероятно, забыли завершающий символ NUL.

Правильный путь в этом случае будет:

//Set up a buffer to store the file and a terminating NUL character
pcfBuffer = new char[ulFLen+1];

//Reading the file
cout<<"Inputting File...";
fStream.seekg(0,ios::beg);
fStream.read(pcfBuffer,ulFLen);
if(!fStream.good()){cout<<"FAILED"<<endl;}else{cout<<"SUCCESS"<<endl;}

// Add NUL character
pcfBuffer[ulFLen] = 0;

Но учтите, что вам нужен только завершающий символ NUL для подпрограмм, которые зависят от него, таких как строковые подпрограммы или при использовании printf с использованием %s. Если вы используете подпрограммы, использующие тот факт, что вы знаете длину (70 символов), она также будет работать без символа NUL.

0 голосов
/ 18 июля 2010

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

И, кстати, он должен быть pcfBuffer = new char[ulFLen+1];

size_t read_count = fStream.gcount();
if(read_count<=ulFlen)
    pcfBuffer[read_count]=0;

Это не будет работатьнезависимо от того, сколько данных нужно прочитать (в вашем случае gcount() должно всегда возвращать 70, так что вместо этого вы можете сделать следующее: pcfBuffer[70]=0;)

...