Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизРабота с CharToOEM Найти похожие ветки
← →
АлеКо (2003-03-25 09:08) [0]Чертовщина какаято!
Пытаюсь заполнить файл данными в кодировке ДОС СР866, для этого использую функцию CharToOEM. Однако после окончания работы программы получаю файл заполненный пустыми строками.
При пошаговой работе в отладчике программа завершается с сообщением ошибки чтото вроде обращения к участку памяти и последняя ошибка RunTimeError 128, но при этом файл заполняется как надо. В чем может быть дело и может использовать чтото другое.
Спасибо!!!
← →
Anatoly Podgoretsky (2003-03-25 09:14) [1]У тебя ошибка в 17 строке
← →
АлеКо (2003-03-25 09:20) [2]в КАКОЙ СТРОКЕ НЕ ПОНЯЛ!!!
← →
Radionov Alexey (2003-03-25 09:21) [3]Не знаю что там у вас в коде, поэтому выкладываю работающий пример (преобразование в верхний регистр для DOS кодировки). Специально (для примера) использую CharToOem, хотя разумнее было бы обойтись просто подъемом регистра.
Var S : String
Begin
With TStringList.Create Do
Try
LoadFromFile("somefile");
S := Text;
OemToChar(PChar(S), PChar(S));
S := AnsiUpperCase(S);
CharToOem(PChar(S), PChar(S));
Text := S;
SaveToFile("somefile");
Finally
Free;
End;
End;
← →
АлеКо (2003-03-25 09:26) [4]А конструкция Try ... Finally обязательна???
← →
Radionov Alexey (2003-03-25 09:27) [5]>АлеКо (25.03.03 09:26)
Страховка от утечки памяти при работе с негарантированнодоступными ресурсами.
← →
АлеКо (2003-03-25 09:35) [6]А может быть необходимы какието директивы кампилятору передавать как например при работе с текстовыми файлами {I-}
← →
Radionov Alexey (2003-03-25 09:38) [7]>АлеКо (25.03.03 09:35)
"Многое еще есть на свете, друг Горацио, что и не снилось нашим мудрецам". (с)
Почитай про "защищенное" программирование и т.п.
← →
АлеКо (2003-03-25 09:41) [8]Ладно спасибо будем пробовать и эксперементировать.
"О сколько нам ошибок трудных готовит ....."
← →
Anatoly Podgoretsky (2003-03-25 09:47) [9]Про строку не забывай в следующий раз и попутно приведенный код может выдать ошибку рантайм, поскольку не совсем защищенный.
← →
Radionov Alexey (2003-03-25 09:50) [10]>Anatoly Podgoretsky © (25.03.03 09:47)
"Пусть в нее кинет камень, кто сам без греха" ;)
Имеется в виду нулевая длинна?
← →
Anatoly Podgoretsky (2003-03-25 10:01) [11]Radionov Alexey © (25.03.03 09:50)
Именно это и эта ситуация вполне вероятная, нужна проверка
if S = "" then Exit;
Вот тогда неожиданной ошибки не будет, да и время не надо тратить на запись.
← →
REA (2003-03-25 10:03) [12]SaveToFile("somefile"); - ограничение на сколько то мегабайт. 32 кажется, но может и меньше.
← →
Radionov Alexey (2003-03-25 10:06) [13]>Anatoly Podgoretsky © (25.03.03 10:01)
Полностью согласен.
PS
Но Free в любом случае сработает. Другое дело, что неприятно заполучить AV в user32.dll (хотя оно тоже не чревато последствиями)
← →
Anatoly Podgoretsky (2003-03-25 10:08) [14]REA © (25.03.03 10:03)
2 гб
← →
Radionov Alexey (2003-03-25 10:08) [15]>REA © (25.03.03 10:03)
Вот так и вырастает флейм :))
MMF - оптимум имхо
← →
REA (2003-03-25 10:21) [16]>2 гб - неа. Проверено опытным путем. Для записи используется TFileStream, который использует WriteFile, который и содержит ограничение. Ну может конечно у меня какая-то кривая OS попалась, но эффект точно был. Пришлось по частям сохранять. Загружает нормально.
← →
Anatoly Podgoretsky (2003-03-25 10:41) [17]А может не ОС, ОС ограничивает размер файла 4 гб, Дельфи 2 гб - Integer, но это на все про все, не только под TStringList
← →
REA (2003-03-25 10:48) [18]Ну вобщем спорить не буду. Попробуй на досуге. Ограничение было именно в API функции WriteFile, поскльку я вытащил ее наружу и попробовал записать напрямую без TFileStream.
← →
Anatoly Podgoretsky (2003-03-25 10:54) [19]А чего пробывать, записывал до 4 гб, после получал ошибку и вытягивать не пришлось, самим TFileStream и писал
← →
REA (2003-03-25 11:09) [20]Ok. Будет время, попробую выделить код в чистом виде и еще разок погонять. Наверно вспышка на солнце была, поскольку оно действительно должно работать... но не работало...
← →
Anatoly Podgoretsky (2003-03-25 11:17) [21]Да не старайся особо, это ограничение системы, а если будешь пробовать, то писать надо в потоке, скажем буферами по 100 мб, тоже для WinApi.
Вот какое ограничение для платформы НТ не знаю, вполне возможно, что свыше 4 гб.
← →
REA (2003-03-25 11:20) [22]Так какое все-таки ограничение в W98? 2Гб? У меня сохранялось существенно меньше (в итоге я сделал сохранение блоками по 10Mb на всякий случай).
← →
Anatoly Podgoretsky (2003-03-25 11:22) [23]REA © (25.03.03 11:20)
4 гб, а сохранялосб меньше у тебя по другой причине, не потоковая запись, ограничение на память.
← →
REA (2003-03-25 11:29) [24]>не потоковая запись - не overlapped в смысле? А TFileStream напрямую пишет.
>ограничение на память - это какое? Что ли TStringList.Text не весь в памяти и WriteFile не может записать его? И как это обойти?
← →
Anatoly Podgoretsky (2003-03-25 11:35) [25]Не знаю, не встречал такого
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c