У меня возникли некоторые проблемы с этим кодом и я хотел бы немного помочь. Эта функция считывает из файла в динамически распределенную памятьЧтение из файла в массив символов, C
Спасибо @JonathanLeffler за помощь - функция отступа работает отлично! Но появилась еще одна проблема: с функцией read_file, которая читает из файла в массив char, который затем передается в отступ.
==================================================================================================================================== ===========================
//--------------- read_file valgrind validations --------------------
==396== 144 bytes in 1 blocks are definitely lost in loss record 62 of 66
==396== at 0x4C2AD10: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==396== by 0x401AC1: read_file (polisher.c:24)
==396== by 0x4025CE: test_indent (test_source.c:174)
==396== by 0x406BC7: srunner_run (in /tmc/test/test)
==396== by 0x402C67: tmc_run_tests (tmc-check.c:134)
==396== by 0x402902: main (test_source.c:235)
==396==
================ =====================================
char *read_file(const char *filename)
{
FILE *f = fopen(filename, "r");
if(!f)
return NULL;
int n = 0, c = 0;
char *a = NULL;
c = fgetc(f);
while(c != EOF)
{
n++;
c = fgetc(f);
}
freopen(filename, "r", f);
a = calloc(n + 1, sizeof(char));
c = fgetc(f);
n = 0;
while(c != EOF)
{
a[n] = c;
n++;
c = fgetc(f);
}
a[n] = '\0';
fclose(f);
return a;
}
====== ================================================== ========
START_TEST(test_indent)
{
char *str = read_file("testifile.c");
if (!str) str = read_file("test/testifile.c");
if (!str) {
fail("[M6.01.c] read_file(\"testifile.c\") returned NULL");
}
char *res = indent(str, " ");
if (!res) {
free(str);
free(res);
fail("[M6.01.c] indent(\"testifile.c\") returned NULL");
}
char buf[OUTPUTLEN];
if (mycompare_new(res, ref61c, buf, OUTPUTLEN)) {
free(res);
free(str);
fail("[M6.01.c] Invalid string from indent(\"testifile.c\"): %s", buf);
}
free(str);
free(res);
test_complete();
}
END_TEST
Что ошибка вы получаете за первый вопрос? Для вывода valgrind вы можете указать, в какой строке вы получите ошибку (какая строка кода - строка 116, 127, ...)? – Garf365
@ Garf365 'strncpy (dest + dest_offset, pad, pad_len + 1);' 116. 'dest [dest_offset ++] = c; '- 127.Когда я пытаюсь отправить эту функцию на сервер, она говорит «Ранний выход с возвращаемым значением 1». Сообщение об ошибке для первого вопроса: «Полученный сигнал: SIGABRT (Aborted). Для основного, PID 9424« – JasonUrban
Пожалуйста, отредактируйте ваш вопрос, чтобы добавить эту информацию. Кроме того, проверяйте каждый раз, когда функция «indent» упоминается в выводе valgrind и добавляет информацию о строке для каждой указанной строки – Garf365