| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Последний символ - два раза |
| Автор: Валерия 7.4.2007, 14:05 | ||||||
Файл 1.txt:
Программа выдает
Почему последний символ выводиться на экран дважды? |
| Автор: apook 7.4.2007, 14:14 | ||
попробуй так т.е проверку на конец файла сделать дважды |
| Автор: Валерия 7.4.2007, 14:25 |
| Спасибо, помогло. |
| Автор: codelord 7.4.2007, 14:32 | ||
| что то не понятно как у тебя вообще заработала эта программа, у меня ошибки, собственно и понятно, зачем тебе string если ты берешь его длину, при этом его длина как раз заведомо меньше даже небольшой строки, делать проверки два раза тоже не красиво.
Добавлено через 3 минуты и 53 секунды char *msg; где собственно память под это? возьми файл где строки скажем хотя бы длины так по 100 символов, и это должно будет вылезти. |
| Автор: Валерия 9.4.2007, 00:00 |
| Тоесть если я просто объявляю char *var1; то не резервирую память, и оно может полезть на память скажем, компилятора и зависнуть все нафик? Добавлено через 6 минут и 36 секунд ... char *buff; memset(buff, 0, 256): ... такое резервирование катит? |
| Автор: nickless 9.4.2007, 00:09 | ||
| Валерия, да, память нужно выделять отдельно. Не инициализированный указатель указывает неизвестно куда, если попытаться записать туда что-нибудь на память других программ не залезешь (у каждой программы своё адресное пространство), но можно затереть себе что-нибудь (хуже) или схлопотать access violation/segfault (немного лучше) Нет, это как раз наглое затирание нулями чего-то. Память нужно или выделить динамически (malloc в C/new в C++) и не забыть освободить потом (free/delete) или указать адрес существующей переменной, например.
|
| Автор: Валерия 9.4.2007, 00:12 | ||
| Поняла когда побольше заперла туды, выкинуло. А вот FILE *fp; такое резервирование тоже получаться не правильное... Ведь те несколько байт, в которых содержится дескриптор, тоже могут полезть не на то что надо? Добавлено через 4 минуты и 32 секунды А вот это написано по всем правилам? (учусь правильно писать). И будет ли оно везде одинаково работать? Скажем там под линуксом...
|
| Автор: nickless 9.4.2007, 00:19 | ||
С FILE *fp всё нормально, fopen аллокирует память сам, тут нужно по идее только проверять открылся ли файл
|
| Автор: nickless 9.4.2007, 00:35 | ||
Не будет, в линуксе нет диска D: А вообще main должна по стандарту возвращать int, и добавь в конце цикла while
|
| Автор: apook 9.4.2007, 04:53 | ||||||||
nickless
и какой компилятор на это не ругнулся? тагда уж
или
|
| Автор: Валерия 9.4.2007, 13:10 |
| Как ни странно но последняя строка не записалась в файл два раза Добавлено через 2 минуты и 7 секунд А вот еще такой вопрос. Если я не делаю free для возврата памяти, и fclose для закрытия файла. Что в этом будет плохого? По идее после завершения работы программы она сама всё закроет и высвободит. Или времени больше на это нужно будет? |
| Автор: nickless 9.4.2007, 17:12 |
Сорри, & лишнюю написал Валерия, если не освобождать память в маленькой программе как эта, ничего не будет, но если память выделяется в других функциях или особенно в цикле, а программа расчитана на продолжительную работу, то память может очень быстро кончится Так что освобождать надо всё всегда и везде, чтобы вошло в привычку (исключения только в исключительных случаях). А у меня записалась, странно... |