Я пытаюсь прочитать весь контент из текстового файла. Вот код, который я написал.Чтение всего содержимого из текстового файла - C
#include <stdio.h>
#include <stdlib.h>
#define PAGE_SIZE 1024
static char *readcontent(const char *filename)
{
char *fcontent = NULL, c;
int index = 0, pagenum = 1;
FILE *fp;
fp = fopen(filename, "r");
if(fp) {
while((c = getc(fp)) != EOF) {
if(!fcontent || index == PAGE_SIZE) {
fcontent = (char*) realloc(fcontent, PAGE_SIZE * pagenum + 1);
++pagenum;
}
fcontent[index++] = c;
}
fcontent[index] = '\0';
fclose(fp);
}
return fcontent;
}
static void freecontent(char *content)
{
if(content) {
free(content);
content = NULL;
}
}
Это использование
int main(int argc, char **argv)
{
char *content;
content = readcontent("filename.txt");
printf("File content : %s\n", content);
fflush(stdout);
freecontent(content);
return 0;
}
Поскольку я новичок в C, интересно выглядит ли этот код совершенным? Вы видите какие-либо проблемы/улучшения?
Компилятор используется: GCC. Но этот код, как ожидается, будет кросс-платформой.
Любая помощь будет оценена по достоинству.
Редактировать
Вот обновленный код с fread
и ftell
.
static char *readcontent(const char *filename)
{
char *fcontent = NULL;
int fsize = 0;
FILE *fp;
fp = fopen(filename, "r");
if(fp) {
fseek(fp, 0, SEEK_END);
fsize = ftell(fp);
rewind(fp);
fcontent = (char*) malloc(sizeof(char) * fsize);
fread(fcontent, 1, fsize, fp);
fclose(fp);
}
return fcontent;
}
Мне интересно, какая будет относительная сложность этой функции?
Я вряд ли думаю, что использование имени файла принесет вам много удовольствия –
ahh .. Извините за это. Я тестировал и забыл удалить его. Очень жаль. –
Я думаю, что в общем вы должны попытаться работать в фиксированных кусках; поэтому в этом случае вы будете читать в PAGE_SIZE байтах за раз (или меньше, если это последний кусок) и печатать каждый кусок по мере их чтения. – wj32