2014-01-05 3 views
0

Я разрабатываю простое клиент-серверное приложение, и теперь у меня проблема с чтением файла на стороне сервера. Вот код:Получить количество ненулевых байтов fread()

int size; 
for (i = 0; i < parts; i++) { 
    size = fread(buffer, 1, 256, file); 
    printf("size: %i \n", size); 
    send(sockfd, buffer, size, 0); 
    /* ... */ 
} 

Я полагал, что если fread() может читать только (например) 50 байт, то размер будет 50, но это не так. Это все еще 256. Есть ли простой способ, как получить число не нулевых байтов?

+1

'fread' действительно возвращает количество элементов (а не байтов, обычно), которые он читает. Разумеется, это не имеет значения * значения * этих байтов. –

+0

Когда он находится рядом с концом файла (менее 256 байт), почему он «читает» байты, которые не находятся в этом файле? И читать их как нулевые байты и возвращает 256? Я думал, что это так ... – user2275785

+2

Это не так. У вас должна быть ошибка в другом месте. 'fread' делает все, что нужно. –

ответ

0

Если вы хотите иметь длину buffer после fread(), почему бы не использовать strlen()?

Кроме того, вероятно, не стоит полагаться на возвращаемое значение fread() для количества прочитанных байтов. В случае, если size (вторая армия) не 1, это может вызвать проблемы с подсчетом actual байт.

+0

Мне нужно прочитать двоичные файлы, поэтому я не могу использовать 'strlen()'. – user2275785

+1

@SouravGhosh - он не может использовать strlen(), потому что strlen() не будет работать. strlen() вызывает так много проблем в файловом/сетевом коде, что на самом деле легендарно. –

+1

@SouravGhosh Он не может использовать strlen(), потому что он читает двоичный файл, поэтому возвращаемые данные могут, например, выглядеть так: «abcd \ 0efgh \ 0zzz». strlen() будет требовать, чтобы данные составляли 4 байта, когда на самом деле было прочитано намного больше. Кроме того, двоичные данные могут даже содержать нулевые байты, и в этом случае strlen может получить доступ к данным за конец массива. –

0

size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream) возвращает количество успешно прочитанных элементов. В случае OP считывается возвращаемое значение 256 средств 256 char.

Простой способ получить число «не нулевых байтов» приведет к простому циклу.

size_t size = fread(buffer, 1, 256, file); 
size_t count = 0; 
for (size_t i = 0; i< size; i++) { 
    if (buffer[i] == '\0') count++; 
} 
number_of_not_null_bytes = count; 

Как говорит @Ron Берк, то \0 могут быть вкраплены в buffer и нужно выбрать обработку, прежде чем перейти к send().

Смежные вопросы