Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.07;
Скачать: CL | DM;

Вниз

Работа с 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
14-19867
Dim!S
2003-03-21 04:53
2003.04.07
Как заработать на программе


1-19605
pavel_k
2003-03-28 19:11
2003.04.07
Цвет пикселя на состовляющие


14-19872
Lex(unreg)
2003-03-21 20:44
2003.04.07
Как грузить Jpeg в Image???


4-19932
Radimir
2003-02-07 13:27
2003.04.07
Очистка памяти


4-19921
Павел
2003-02-04 09:15
2003.04.07
Запрет на сворачивание