|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
Как правильно открыть TXT файл для чтения, например чтобы запихнуть в TextBox или просто загрузить в массив строк17.09.2023, 18:23. Показов 3938. Ответов 82
Метки нет (Все метки)
Я ещё раньше не занимался этим вопросом с помощью API-функций, так как всегда работал с помощью стандартных методов VB6. А теперь, поняв фундаментальный недостаток VB6-метода (отсутствие поддержки юникода в именах файлов), я хочу научиться открывать/загружать стандартный текстовый файл с помощью API.
Итак, за это отвечает у нас функция ReadFile, но уважаемый The Trick, я посмотрел, загружает файлы каким-то странным, другим способом, через функции CreateFileMapping и MapViewOfFile, я если честно в этом ничего не понимаю. Смотрел описание этих функций так толком и не понял зачем их использовать вместо стандартного ReadFile.
0
|
|
| 17.09.2023, 18:23 | |
|
Ответы с готовыми решениями:
82
GDI+ как освободить файл или открыть только для чтения Как открыть доступ для чтения файла 'output.txt'? Как поток чтения (или записи) запихнуть в класс? |
|
Модератор
|
|||||||
| 21.09.2023, 21:13 | |||||||
Сообщение было отмечено HackerVlad как решение
Решение
, а вот через массивы:
1
|
|||||||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||||||
| 21.09.2023, 23:11 [ТС] | ||||||
|
The trick, спасибо большое за труды, но ты забыл скопировать декларации и например я даже не знаю как объявлять структуру SAFEARRAY, вообще никогда с этим не работал.
Добавлено через 2 минуты В твоих других кодах я пока нашёл только структуру SafeArray1d просто SafeArray пока нигде не нашёл ещё Добавлено через 3 минуты Я смотрю много твоих других примеров и везде встречаю только SAFEARRAYBOUND и SAFEARRAY1D структуры. SAFEARRAY просто пока нигде не могу найти. Добавлено через 2 минуты Ну ты и задал мне задачку. Нигде не могу найти структуру SAFEARRAY просто. SAFEARRAY1D есть только у тебя. SAFEARRAY2D в апи вьювере. Добавлено через 37 секунд Может это одно и тоже? Добавлено через 1 минуту Предположу что это одно и тоже, спустя 10 минут безуспешных поисков... Добавлено через 7 минут Ну наконец-то я ели нарыл всё недостающее. В итоге я НЕ почувствовал разницы в скорости в сравнении с моим методом со строкой. Но теперь твой массив зато стал работать так же быстро как и в случае со строкой. Полный код:
The trick, в итоге: кода гораздо больше нужно писать, а разницы в скорости НЕТУ!!!
0
|
||||||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|||
| 21.09.2023, 23:45 [ТС] | |||
|
Разозлившись, сейчас буду тестировать аж целых 500 Мб на загрузку, чтобы проверить а есть ли всё же хоть какая-то разница в скорости.
Добавлено через 1 минуту На 500 Мб у меня не хватает памяти) Пхахаххаах, разбежался блин пхахахах Добавлено через 2 минуты The trick, кстати ты говорил мол я не делаю проверок на случай если памяти не хватит. Вот я решил загрузить 500 Мб, памяти не хватило и ничего не произошло. Краха программы не случилось. Просто вернуло пустую строку. Добавлено через 1 минуту Так что получается проверку делать не обязательно. Добавлено через 5 минут The trick, на 10-20 млск меньше времени твой способ, при максимальном 450 Мб файле что я только могу загрузить, на 500 у меня уже оперативки не хватает просто Добавлено через 51 секунду Добавлено через 2 минуты Ну вот как бы ты не хаил мой способ со строкой, а он не медленнее чем твой. А ты пытался доказать что он медленнее. Добавлено через 9 минут Добавлено через 6 минут The trick, так что ты меня извини пожалуйста, ноя не вижу смысла переходить на твою технологию, я нормально написал функцию изначально загружая в строку. по крайне мере кода писать нужно гораздо меньше. скорость одинаковая.
0
|
|||
|
Модератор
|
|||
| 22.09.2023, 12:44 | |||
|
1
|
|||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 22.09.2023, 17:24 [ТС] | |
|
testuser2, с UTF-8 форматом Integer не проканает, только с UTF16
Добавлено через 42 секунды testuser2, там просто на один сивол может быть то один байт, то два байта фиг поймешь Добавлено через 1 минуту The Trick меня короче не убедил, весь день переписывал свои коды, смотрел скорости - всё зря, мой код со стркоами вполне оптимален Добавлено через 11 минут Как буд-то я файл по 100 тысяч раз загружаю, можно подумать Добавлено через 8 секунд Провёл очень много тестов Добавлено через 10 секунд The Trick не убедил ни скольео
0
|
|
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 23.09.2023, 15:16 [ТС] | |
|
Тем ни менее, хоть я и не очень согласен с The Trick, но тем ни менее моя тема называется как правильно открыть TXT файл. Поэтому я помечу ответ The Trick как решение, потому что у него чуть более правильный вариант, чем у меня, и на 10 млск быстрее. На этом тему мы закончили, я думаю.
0
|
|
| 23.09.2023, 17:26 | |
|
В любом случае это быстрые методы. Кстати, сейчас проверил, буфер строки можно расширять с помощью HeapRealloc, так же как и массив. Только после этого надо менять заголовочный указатель у строки на новый.
0
|
|
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||||||
| 24.09.2023, 19:53 [ТС] | ||||||
|
Придётся вернуться к этой теме снова, так как я обнаружил ошибку в своей функции ReadFromTextFileUTF8. Если в загружаемом файле есть запись BOM то функция загружала на 3 байта больше чем нужно. Эту ошибку я исправил:
0
|
||||||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||
| 24.09.2023, 21:39 [ТС] | ||
|
Добавлено через 1 минуту Да вроде FileSize надо. Что не так? Добавлено через 47 секунд Заранее я ведь не знаю будущий размер буфера, поэтому я тебя не понимаю.
0
|
||
|
Модератор
|
||
| 24.09.2023, 21:42 | ||
|
Во-вторых, когда ты делаешь lpMultiByteStr = StrPtr(stringbuffer) + 3 то размер у тебя соответственно уменьшается.
0
|
||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 24.09.2023, 21:52 [ТС] | |
|
The trick, то есть надо написать либо FileSize -3 либо numread или numread -3?
Добавлено через 1 минуту может numread просто? без -3
0
|
|
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||||||
| 24.09.2023, 21:55 [ТС] | ||||||
|
numread просто надо, без -3
с -3 уже не работает код падает Добавлено через 28 секунд Для узнавания буфера (первый вызов функции):
0
|
||||||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 24.09.2023, 21:57 [ТС] | |
|
Поменял FileSize на numread
Добавлено через 2 минуты Правильно ли я тебя понимаю что ты предлагаешь мне в SysAllocStringLen не отризать 3 символа, как я это сделал, а отрезать в другом месте
0
|
|
|
Модератор
|
|
| 24.09.2023, 21:59 | |
|
HackerVlad, вот ты узнал размер файла, к примеру 30 байт. Ок. Смотришь первый BOM (если файл больше или равен 3 байтам). Если BOM присутствует то ты пропускаешь его при конверсии в UTF-16, правильно? Правильно. Ты так и делаешь, но передаешь что в функцию MultiByteToWideChar те же 30 байт. Вопрос - что получит функция если у тебя буфер в 30 байт, ты пропускаешь первые 3 и просишь ее конвертировать 30 (!) байт? Правильно - чтение за пределом буфера и неверный результат преобразования.
0
|
|
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
||||||
| 24.09.2023, 22:00 [ТС] | ||||||
|
Проверяй мои исправления:
Добавлено через 1 минуту Я работаю только с UTF8.
0
|
||||||
| 24.09.2023, 22:00 | |
|
Открыть файл и загрузить содержимое в TextBox Как расшифровать файл dat или просто открыть его и вывести на экран Открыть для записи текстовый файл data.txt и записать в него полученный массив, закрыть файл Как открыть файл для чтения?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|