Как оптимальнее прочитать текст из файла - целиком или поблочно? - C (СИ)

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

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

#include "stdafx.h"
#include <conio.h>
#include <locale.h>
#include <string>
char buf[8388609]={};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"RUS");
    char filename[20]={};
    printf("Введите название файла:");
    gets(filename);
    FILE*f=fopen(filename,"rt");
        int size_of_file=ftell(f);
    fread(buf,size_of_file,1,f);
    printf("%s",buf);
}
Почему не считывает из файла строку? Если переменной size_of_file задать константное значение, к примеру int size_of_file=20;, то все работает и считывает из файла прекрасно эти 20 символов. Почему тут такая проблема? Еще вопрос: имеется файл( может достигать размеров 128МБ), как эффективнее всего считать оттуда инфромацию? Сразу в буфер все загнать (как сделала это я), или же считывать по блокам, к примеру, по 100 байт.

Решение задачи: «Как оптимальнее прочитать текст из файла - целиком или поблочно?»

textual
Листинг программы
#include "stdafx.h"
#include <conio.h>
#include <locale.h>
#include <string>
 
char *buf;
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"RUS");
    char filename[20]={};
   // printf("Введите название файла:");
    //gets(filename);
    FILE*f=fopen("file.txt","rt");
    if ((f = fopen("file.txt", "rt")) == NULL )
    {  
        printf("Не удается открыть файл!");
        exit(1);
    }
    fseek(f,0,SEEK_END);
    int size_of_file=ftell(f);
    fseek(f,0,SEEK_SET);
    buf=(char*)malloc(size_of_file+1);
    buf[size_of_file+1]=0;
    fread(buf,size_of_file,1,f);
    puts(buf); 
    //char str1[100]={};
 
    char rez[100]={};
    int cnt=0;
    char exit[5]="exit";
 
    int len=255; //Длина строки
 
    char **Massiv=(char**)malloc((size_of_file+1)*sizeof(char)); 
    for (int i=0;i<(size_of_file+1);i++) 
        Massiv[i]=(char*)malloc(len);
    int cntmass=0;
    while(cnt<size_of_file-2)
    {
        int i=cnt,cntrez=0;
        for(i;i<size_of_file;i++,cntrez++)
        {
            if(buf[i]!=' ')
                rez[cntrez]=buf[i];
            else
            {
                cnt=i;
                break;
            }
        }
        Massiv[cntmass]=rez;
        printf("%s ",Massiv[i]);
        cntmass++;
        int y=strlen(rez);
        for(int j=0;j<=y;j++)
            rez[j]=0;
        cnt++;
        if(i==size_of_file)
        {
            cnt=i;
        }
        }
    /*for(int i=0;i<cntmass;i++)
        printf("\n%s\n",Massiv[i]);*/
    free(Massiv);
    fclose(f);
    getch();
    return 0;
}

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

  1. В начале кода устанавливается русская локаль с помощью setlocale(LC_ALL,RUS).
  2. Создается пустая строка filename для ввода имени файла.
  3. Подключаются необходимые заголовочные файлы.
  4. Объявляются переменные: buf для чтения содержимого файла, filename для ввода имени файла, f для работы с файлом, size_of_file для хранения размера файла, rez для хранения прочитанных данных, cnt для подсчета количества прочитанных символов, exit для проверки наличия команды выхода, len для длины строки в массиве, Massiv для хранения массива строк.
  5. Открывается файл с помощью fopen(file.txt,rt) и проверяется на открытие с помощью f == NULL.
  6. Получается размер файла с помощью fseek(f,0,SEEK_END) и ftell(f).
  7. Смещается обратно в начало файла с помощью fseek(f,0,SEEK_SET).
  8. Выделяется память для buf с помощью malloc(size_of_file+1).
  9. Выделяется память для массива строк с помощью malloc((size_of_file+1)*sizeof(char)).
  10. Создается цикл для чтения содержимого файла и разделения его на строки.
  11. В каждой итерации цикла проверяется, является ли текущий символ пробелом.
  12. Если символ не является пробелом, он добавляется в rez.
  13. После каждой итерации cnt увеличивается на 1.
  14. После каждой строки Massiv добавляется в массив строк.
  15. После окончания чтения файла выводится содержимое массива строк.
  16. Все выделенные памяти освобождаются с помощью free().
  17. Файл закрывается с помощью fclose().
  18. Ожидается нажатие клавиши с помощью getch().
  19. Возвращается 0, что означает успешное выполнение программы.
  20. Код не содержит ошибок, и программа будет выполняться без проблем.

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


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

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

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