NULL);
fseek(f, 0L, SEEK_END);
const size_t size = ftell(f);
fseek(f, 0L, SEEK_SET);
return size - 1;
}
static char*
fdump(FILE *f)
{
assert(f != NULL);
char *str = (char*)malloc(fsize(f));
size_t i = 0;
for(; !feof(f); ++i)
{
str[i] = fgetc(f);
}
str[i - 1] = '\0';
return str;
}
Пока нет...
А почему в fsize return size -1 ?
Там в конце иначе ffffff, ну EOF лежит
1 его ты должен заменить на \0, 2 это не символ, его нельзя положить в chat, это означает, что у тебя ещё и неверный код ввода
Заменяется он в fdump а читается ТК feof
Удали свой код и перепиши на плюсах
Нет, посмотри внимательно...
Не знаю куда и смотреть :\
Imho ты читаешь на 1 байт меньше и последний символ затираешь \0
Ну я прошёлся по строке в 0x там на конце лежат 0a и fffffff 0а это LF а последний EOF ТК читаю размер всего файла, значит и эти 2 символа
В файле не может быть EOF, то есть может, но это другой в "символ", кажется \13, escape
Как не может быть EOF? А как тогда feof работает? Написано же что он идёт пока не встретит EOF
Нет, он идёт, пока не дойдёт до конца файла
Посмотри определение EOF, может, придёт озарение... EOF специально определено так, что его не может в файле никогда
Если читать последовательно из файла символы != EOF как это тогда работает?
На то он спецсимвол
Ну так это же символ, значит его можно считать?
Нельзя, его вернет подсистема ввода, достигнув конца файла
недавно статью хабра кидали, что eof это не символ, <s>а состояние души</s>
Окей, его вернула система, нам то что? Мы его получили, отрезали размер, все хорошо?
Он не входит в размер файла
Так я и делаю size - 1 при возврате
Нет, у тебя там в коде ошибка, я про это и говорил. С размером, и при чтении
Чтоб еоф откинуть
Согласен, я его и не включаю в размер файла
Ты и последний байт из файла не включаешь
Убедить мне вас не удастся, поэтому придется перейти к оскорблениям
Пройдись отладчиком и проверь...
получается последний байт - это EOF?
Убедить в чем? В вашей правоте?
Выше же статью дали, если и там не написано, зачем этот Хабр нужен вообще?
Лучше, я использую стандартные средства плюсов и сравню то что они мне написали
Да это была присказка. Я реально не вьезжаю, что вам не понятно с eof. Это маркер конца, в файле он никогда не появится. Поэтому возращается int при считывании единичного символа, чтобы помимо unsigned char от 0 до 255 иметь возможность вернуть -1, то есть eof
Окей, я его не включаю в размер в функции fsize все ок?
Ты о чем и почему он вообще там появился?
Вот возьмем содержимое файла: 0x00, 0x01, EOF. Размер этого файла 2. EOF - маркер конца, он в файле не присутствует, а возвращается подсистемой ввода вывода.
Так долго к этому шли ))
Да, вроде, сказано это было выше уже несколько раз
Обсуждают сегодня