2013-08-15 2 views
3

Я следующий код ниже:разница между fgets и FREAD

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
int lendata; 
printf("Content-type:text/html\n\n"); 
printf("<html><body>"); 
lendata = atoi(getenv("CONTENT_LENGTH")); 
char *buf = malloc(lendata+1); 
fread(buf,lendata,1,stdin); 
printf("%s\n<br>",buf); 
printf("%d",lendata); 
free(buf); 
printf("</body></html>"); 
return 0; 

} 

Когда я использую fgets, он обрезает данные выводятся на экран. Но когда я использую fread, он отображает весь контент. Кстати, это скрипт cgi для загрузки файла html с использованием метода post. Любая помощь будет значительно оценена.

+3

Отступ имеет значение. – haccks

+0

Извините. Виноват. – JKTA

ответ

10

Обе функции хорошо задокументированы (fread, fgets) на веб-сайте C++. Обратитесь к ним за глубокой и технической разницей.

Короче говоря, fgets не прочтет до первой новой строки, максимальное количество байт для чтения сразу, или EOF, который когда-либо отправляется первым, тогда как fread будет читать определенное количество слов (где я определяю слово как кусок байтов, скажем, группы по 4 байта) и останавливаться, когда достигнут этот предел, или 0 байтов были прочитаны (обычно это означает EOF или ошибка).

Если вы хотите использовать любую функцию, чтобы прочитать до EOF то это будет выглядеть следующим образом:

char buffer[ buff_len ]; 

// ... zero-fill buffer here. 

while (fgets(buffer, buff_len, stdin) != EOF) { 
    // ... do something with buffer (will be NULL terminated). 
} 

while (fread(buffer, sizeof(buffer[ 0 ]), sizeof(buffer)/sizeof(buffer[ 0 ]), stdin) != 0) { 
    // ... do something with buffer (not necessarily NULL terminated). 
} 
+0

Итак, мне нужно использовать циклы для чтения нескольких строк? – JKTA

+0

@JKTA, да, у вас есть правильная идея :) Я отредактирую это, чтобы быть более ясным. –

+0

Спасибо! Очень ценится. – JKTA

2

fgets прекращает читать при столкновении \n, в то время как fread читает.

+0

Итак, я бы использовал fgets для чтения нескольких строк, разделенных новыми строками? – JKTA

+0

u может использовать 'fgets' в цикле до тех пор, пока не будет достигнуто' EOF'. –

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