Проблема с консольным приложением, Какой-то неуловимый глюк, всю голову уже сломал... |
Здравствуйте, гость ( Вход | Регистрация )
Проблема с консольным приложением, Какой-то неуловимый глюк, всю голову уже сломал... |
x-8973 |
22.2.2013, 10:18
Сообщение
#1
|
Студент Группа: Участник Сообщений: 25 Регистрация: 22.2.2013 Пользователь №: 3720 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем бобра!
Второй день бьюсь с консольным приложением, пытаясь найти и искоренить странный глюк. Приложение должно запросить у пользователя два имени файлов, обработать первый из них и записать результаты во второй. Проблема состоит в том, что сразу после ввода первого имени файла программа вываливается в критическую ошибку "память не может быть written". Если закомментировать весь код, оставив только ввод имен файлов, то прорабатывают оба ввода и прога останавливается. Ничего понять не могу. Может, здесь кто поможет? Код main.cpp: Раскрывающийся текст
Код cut-off_proc.h: Раскрывающийся текст
Вот скрин ошибки: |
|
|
Iron Bug |
22.2.2013, 10:24
Сообщение
#2
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
куда ты пишешь? в пустой указатель? естественно, будет ошибка. память должна быть выделена, перед тем, как туда что-то писать. |
|
|
x-8973 |
22.2.2013, 10:51
Сообщение
#3
|
Студент Группа: Участник Сообщений: 25 Регистрация: 22.2.2013 Пользователь №: 3720 Спасибо сказали: 0 раз(а) Репутация: 0 |
куда ты пишешь? в пустой указатель? естественно, будет ошибка. память должна быть выделена, перед тем, как туда что-то писать. Вот этот код прекрасно работает: Раскрывающийся текст
Ладно, согласен, тут косяк. Но я же не знаю, какой длины имя файла введет пользователь. Соответственно, я не знаю, сколько памяти выделять. Да, проблема оказалась в этом... Огромная глупость с моей стороне, это ведь еще на первом курсе проходят... Еще один глупый вопрос: а сколько же все-таки нужно выделять памяти под имя файла? В Дельфи есть константа MAX_LEN, если мне память не изменяет. Может, и в QT что-то похожее есть? |
|
|
lanz |
22.2.2013, 11:20
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
А если серьезно то лучше использовать QTextStream:
|
|
|
Wlad |
22.2.2013, 11:43
Сообщение
#5
|
Студент Группа: Участник Сообщений: 21 Регистрация: 9.12.2008 Пользователь №: 450 Спасибо сказали: 0 раз(а) Репутация: 1 |
Цитата В Дельфи есть константа MAX_LEN, если мне память не изменяет. Может, и в QT что-то похожее есть? Qt здесь не причем. Есть виндовая переменная MAX_PATH (определена в файле windef.h) равная 260 символам. Это и есть максимальная длина файла с путем к нему. Виндовые функции, работающие с файлами проверяют имя файла на эту длину Это ограничение можно объехать, но это другой вопрос. |
|
|
Iron Bug |
22.2.2013, 12:32
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
если пользоваться стандартным вводом и только под вендой, то можно использовать scanf_s.
длина имени файла, вообще говоря, зависит даже не от оси, а от файловой системы. в принципе, можно просто взять какое-то заведомо большое число. однако, как написал lanz, если уж ты собрался юзать Qt, то логично воспользоваться потоками, которые эта библиотека предоставляет. |
|
|
x-8973 |
22.2.2013, 13:00
Сообщение
#7
|
Студент Группа: Участник Сообщений: 25 Регистрация: 22.2.2013 Пользователь №: 3720 Спасибо сказали: 0 раз(а) Репутация: 0 |
lanz, благодарствую)
Еще вопрос. Подумал, что раз уж юзать потоки, то юзать их и на выводе данных. Написал
При запуске ничего не вывелось. В принципе, не критично, printf в этом плане отлично справляется) Просто интересно, можно ли поток и для вывода данных использовать) |
|
|
Алексей1153 |
22.2.2013, 13:30
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Вот этот код прекрасно работает: повезло ))) Но я же не знаю, какой длины имя файла введет пользователь. Соответственно, я не знаю, сколько памяти выделять. это в общем случае вполне решабельно: считывать по 1 символу и накапливать в буфере А инициализировать переменные всё равно нужно |
|
|
lanz |
25.2.2013, 9:21
Сообщение
#9
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Буфер приходится чистить вручную. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 23:26 |