Считывание файла в буфер - C (СИ)
Формулировка задачи:
Проблема заключается в том, что поблочное чтение файла просто считывает из него 256 символов в буфер и все, как будто так и надо. Вот код программы, проверьте сами:
Я вообще не понимаю, почему так происходит? Текст программы просто для того, чтобы вы посмотрели, чему равна переменная buf. Сделайте текстовый файл, напишите текст, проверьте, чему buf равен. И увидите, что в нем лежит только 256 символов. Всегда. Какой файл бы ни был (ну не меньше 256 символов, конечно). В чем проблема? Функция fread, может, читает максимум 256, или что еще?
Может, тут кто-нибудь знает, в чем проблема заключается. Буду рад, если кто-нибудь мне объяснит и скажет, как нужно записать. Я уже и в visual studio проверял, и в обычном borland c, везде все одинаково!
И если даже считывает не функцией fread, а, например, так:
То в буфере оказывается тоже 256 символов.
Может, проблема в типе char? Если да, то как тогда сделать, чтобы он считал больше 256 символов?
#include "stdafx.h" #include "stdio.h" #include "string.h" #include "stdlib.h" using namespace System; int main(array<System::String ^> ^args) { FILE *fin; fin=fopen("C:\\Projects\\text.txt","r"); if (!fin) { puts("Can't open input file"); return 1; } fseek(fin,0,SEEK_END); long len=ftell(fin); char *buf=new char[len+1]; const int l_block=1024; int num_block=len/l_block; rewind(fin); fread(buf,l_block,num_block+1,fin); buf[len]='\0'; getchar(); return 0; }
char *p; rewind(fin); for (p = buf; *p != EOF; p++) *p = fgetc(fin); buf[len-1] = '\0';
Решение задачи: «Считывание файла в буфер»
textual
Листинг программы
#include "stdafx.h" #include "stdio.h" #include "string.h" #include "stdlib.h" #define MAXSTR 20 using namespace System; int main(array<System::String ^> ^args) { int i, j; // открытие входного файла FILE *fin; fin = fopen("C:\\Projects\\text.txt", "r"); if (!fin) { puts("Can't open input file"); getchar(); return 1; } fseek(fin, 0, SEEK_END); // указатель в конец файла long len = ftell(fin); // запоминаем длину файла char *buf = new char[len+1]; // выделение памяти под буфер // неформатированное чтение текстового файла (поблочное) const int l_block = 1024; // длина блока для чтения int num_block = len/l_block + 1; // определение числа блоков rewind(fin); // указатель в начало файла fread(buf, l_block, num_block + 1, fin); // чтение блоков из файла buf[len] = '\0'; // помещаем в буфер нуль-литеру char **sentence = (char **)malloc(sizeof(char *) * MAXSTR); // выделяем память для массива предл. (1-й индекс) for (i = 0; i < MAXSTR; i++) { sentence[i] = (char *)malloc(sizeof(char) * 300); // выделяем память для массива предложений (2-й индекс). Макс длина одного предлож. - 300 символов sentence[i][0] = '\0'; } /* запись предложений в массив */ printf("Razbivaem fail na otdel'nye predlojeniya:\n\n "); char *pos = buf; i = 0; while (pos - buf < len) { char *dot = strstr(pos, ". "); int sentence_length = dot - pos + 1; strncpy(sentence[i], pos, sentence_length-1); sentence[sentence_length-1] = '\0'; pos += pos - dot + 2; printf("%s\n", sentence[i]); i++; } printf("\n\nNajmite Enter"); getchar();
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем максимальную длину строки в массиве (20)
- Открываем входной файл для чтения
- Перемещаем указатель в конец файла
- Запоминаем длину файла
- Выделяем память под буфер (массив символов)
- Определяем количество блоков для чтения
- Перемещаем указатель в начало файла
- Читаем блоки из файла в буфер
- Добавляем нуль-литеру в буфер
- Выделяем память для массива предложений (максимум 20)
- Выделяем память для каждого предложения (максимум 300 символов)
- Устанавливаем начальный символ каждого предложения в нуль
- Записываем предложения в массив
- Выводим предложения на экран
- Закрываем файл
- Освобождаем память, выделенную под буфер и массив предложений
- Ждем нажатия клавиши Enter
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д