Чтение (считывание) текстового файла любого размера в строку - на си
Primary tabs
Forums:
Модифицируем данную функцию для того чтобы читать из файла , а не только из стандартного потока ввода.
Так как же будет выглядеть код?
Посмотрим =
/*считывание файла любой длины в строку - сохранение
считывание всех данных из файла в троковую переменную на языке си*/
char *full_file_r(FILE *fp ,char * prompting_message , size_t user_block_size) /* make sure that the input is clear when you call this function */
{ /**/
char *result;
/*variables and initialization*/
size_t block_size ;
if (user_block_size) block_size = user_block_size; /*если пользователь указал собственный , то выбираем его как рабочий*/
else block_size = 5; /*иначе используем стандартный блок длинной = 5*/
if (!fp) fp =stdin; /*если поток не указан - будем читать из стандартного*/
char *block, *temp;
size_t size = block_size;
size_t n = 0; /* здесь будет храниться размерность считанной строки*/
/*printf("\n=[%s]", "[" .prompting_message. " ]" . "\n");*/
if ( prompting_message)
{
printf("%s \n", prompting_message); /* show message wich specify the reason of input reading - for examp "input clearing" */
}
/*function itself */
result = block = (char*)malloc(size); /*выделяем блоку и строке результата память длинной , равной длинне блока разового чтения*/
if (!result) return NULL; /*если при выделении памяти произошла ошибка - отражаем это в переменной результата*/
*result = '\0'; /* используем это присвоивание как признак успешности - см. дальнейшие комментарии после цикла*/
/*этот цик*/
for (;;) /*этот цикл - ключевой в работе данной функции*/
{
if (fgets(block, block_size, fp) == NULL) /*читаем блок данных стандартой длинн и размещаем данные в переменной "блок"*/
break; /* если при чтении произошла ошибка - выходим из цикла */
n += strlen(block);
if (result[n - 1] == EOF) /* если последний сивол считанной строки - это СИМВОЛ КОНЦА ФАЙЛА, то.....*/
break; /*...выходим из цикла */
size += block_size; /* наращиваем размерность строки результата на величину, равную длинне стадартного блока чтения*/
temp = (char*)realloc(result, size); /* переразмещаем данные по адресу возвращаемой строки в новой области большего размера - сохраняем адрес этой области в вспомогаетльную переменную */
if (temp == NULL)
break;
result = temp; /* сохраняем адрес новой области памяти из вспомогательной переменной в оригинальную переменную результата*/
block = result + n; /* перемещаем указатель записи очередного блока данных на первую свободную ячейку памяти в новой области данных*/
}- Log in to post comments
- 7235 reads