Считывание файла в буфер - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Проблема заключается в том, что поблочное чтение файла просто считывает из него 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;
}
Я вообще не понимаю, почему так происходит? Текст программы просто для того, чтобы вы посмотрели, чему равна переменная buf. Сделайте текстовый файл, напишите текст, проверьте, чему buf равен. И увидите, что в нем лежит только 256 символов. Всегда. Какой файл бы ни был (ну не меньше 256 символов, конечно). В чем проблема? Функция fread, может, читает максимум 256, или что еще? Может, тут кто-нибудь знает, в чем проблема заключается. Буду рад, если кто-нибудь мне объяснит и скажет, как нужно записать. Я уже и в visual studio проверял, и в обычном borland c, везде все одинаково! И если даже считывает не функцией fread, а, например, так:
char *p;
    rewind(fin);
    for (p = buf; *p != EOF; p++)
        *p = fgetc(fin);
    buf[len-1] = '\0';
То в буфере оказывается тоже 256 символов. Может, проблема в типе char? Если да, то как тогда сделать, чтобы он считал больше 256 символов?

Решение задачи: «Считывание файла в буфер»

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();

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Определяем максимальную длину строки в массиве (20)
  3. Открываем входной файл для чтения
  4. Перемещаем указатель в конец файла
  5. Запоминаем длину файла
  6. Выделяем память под буфер (массив символов)
  7. Определяем количество блоков для чтения
  8. Перемещаем указатель в начало файла
  9. Читаем блоки из файла в буфер
  10. Добавляем нуль-литеру в буфер
  11. Выделяем память для массива предложений (максимум 20)
  12. Выделяем память для каждого предложения (максимум 300 символов)
  13. Устанавливаем начальный символ каждого предложения в нуль
  14. Записываем предложения в массив
  15. Выводим предложения на экран
  16. Закрываем файл
  17. Освобождаем память, выделенную под буфер и массив предложений
  18. Ждем нажатия клавиши Enter

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы