Схема:
В вашем коде есть ряд проблем:
char *readFile(char *fileName)
{
FILE *file;
char *code = malloc(1000 * sizeof(char));
file = fopen(fileName, "r");
do
{
*code++ = (char)fgetc(file);
} while(*code != EOF);
return code;
}
code
каждый раз Вы читаете символ и возвращаете code
обратно вызывающей стороне (даже если он больше не указывает на первый байт блока памяти, как он был возвращен malloc
). fgetc(file)
к char
. Вам нужно проверить на EOF
перед приведением результата к char
. Важно сохранить исходный указатель, возвращенный malloc
, чтобы вы могли освободить его позже. Если мы пренебрегаем размером файла, мы можем достичь этого еще с помощью следующего:
char *readFile(char *fileName)
{
FILE *file = fopen(fileName, "r");
char *code;
size_t n = 0;
int c;
if (file == NULL)
return NULL; //could not open file
code = malloc(1000);
while ((c = fgetc(file)) != EOF)
{
code[n++] = (char) c;
}
// don't forget to terminate with the null character
code[n] = '\0';
return code;
}
Существуют различные системные вызовы, которые дадут вам размер файла; распространенным является stat
.
Я думаю, что наиболее существенной проблемой является то, что вы увеличиваете code
, когда читаете материал, а затем возвращаете конечное значение code
, то есть вы будете возвращать указатель на конец строки. Возможно, вы захотите сделать копию code
перед циклом и вернуть ее вместо этого.
Кроме того, строки C должны заканчиваться нулем. Вам нужно убедиться, что вы ставите '\0'
сразу после последнего прочитанного вами символа.
Примечание: Вы можете просто использовать fgets()
, чтобы получить всю строку за один удар.
файл открывается и не закрывается для каждого вызова функции также