Как оптимальнее прочитать текст из файла - целиком или поблочно? - 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);
}Решение задачи: «Как оптимальнее прочитать текст из файла - целиком или поблочно?»
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;
}
Объяснение кода листинга программы
- В начале кода устанавливается русская локаль с помощью
setlocale(LC_ALL,RUS). - Создается пустая строка
filenameдля ввода имени файла. - Подключаются необходимые заголовочные файлы.
- Объявляются переменные:
bufдля чтения содержимого файла,filenameдля ввода имени файла,fдля работы с файлом,size_of_fileдля хранения размера файла,rezдля хранения прочитанных данных,cntдля подсчета количества прочитанных символов,exitдля проверки наличия команды выхода,lenдля длины строки в массиве,Massivдля хранения массива строк. - Открывается файл с помощью
fopen(file.txt,rt)и проверяется на открытие с помощьюf == NULL. - Получается размер файла с помощью
fseek(f,0,SEEK_END)иftell(f). - Смещается обратно в начало файла с помощью
fseek(f,0,SEEK_SET). - Выделяется память для
bufс помощьюmalloc(size_of_file+1). - Выделяется память для массива строк с помощью
malloc((size_of_file+1)*sizeof(char)). - Создается цикл для чтения содержимого файла и разделения его на строки.
- В каждой итерации цикла проверяется, является ли текущий символ пробелом.
- Если символ не является пробелом, он добавляется в
rez. - После каждой итерации
cntувеличивается на 1. - После каждой строки
Massivдобавляется в массив строк. - После окончания чтения файла выводится содержимое массива строк.
- Все выделенные памяти освобождаются с помощью
free(). - Файл закрывается с помощью
fclose(). - Ожидается нажатие клавиши с помощью
getch(). - Возвращается 0, что означает успешное выполнение программы.
- Код не содержит ошибок, и программа будет выполняться без проблем.