Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/35: Рейтинг темы: голосов - 35, средняя оценка - 4.89
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
1

Чтение файла полностью, используя функцию ReadFile

03.01.2020, 16:32. Показов 7014. Ответов 13

Author24 — интернет-сервис помощи студентам
Добрый день! Появилась следующая проблема. Дан текстовый файл с несколькими строками текста. Необходимо считать его полностью с помощью функции ReadFile. Прошу помочь в решении проблемы. Заранее спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2020, 16:32
Ответы с готовыми решениями:

Чтение из файла ReadFile
проблема такова что я не могу понять, как сделать условие вида: если при чтении файла нашли...

Чтение файла ReadFile и вывод
HANDLE myFile; DWORD m; wchar_t cBuffer; myFile = CreateFile(L"c:\\currentversion1.txt",...

Копирование файла кусками по 64КБ, используя ReadFile и WriteFile
Здравствуйте, уважаемые форумчане! На вас последняя надежда! Задача такая: написать программу для...

Создание файла с массивом и чтение этого файла обратно используя ShareActionProvider
Есть созданный массив, после нажатия на кнопку он должен вносится в файл, а потом передать этот...

13
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
03.01.2020, 16:47 2
BlackStoneBlack, покажите, как Вы пытались решить эту задачу. Подправим...
В целом идея проста: открываем файл, узнаем длину файла, выделяем буфер нужного размера, читаем, закрываем файл.
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
03.01.2020, 16:54  [ТС] 3
liv, идею-то я понял. Но вот с реализацией что-то не получается. Пробовал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string line = "";
HANDLE file = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
 
if (file != INVALID_HANDLE_VALUE)
{
    DWORD size = GetFileSize(file, nullptr), bytes;
    char* text = new char[size + 1];
    ReadFile(file, text, size, &bytes, NULL);
    text[size] = 0;
    line.append(text);
    delete[] text;
}
 
CloseHandle(file);
Причём, как оказывается, он читает только первую строку. И я не совсем понимаю, почему. По сути, мне нужно получить весь текст файла в строковую переменную.
0
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
03.01.2020, 17:05 4
Лучший ответ Сообщение было отмечено BlackStoneBlack как решение

Решение

BlackStoneBlack, ну, наверное, открывать следует так:
C++
1
HANDLE file = CreateFile(PATH_FILE_WINAPI_FUNCTIONS, GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
CREATE_ALWAYS приводит к тому, что файл создается заново с нулевой длиной. Да и открывать на запись - лишнее...
1
Заблокирован
03.01.2020, 17:19 5
Также:
по-умолчанию, проект студии "UNICODE"; изменить на "MBCS"
или использовать функции явно: ReadFileA
0
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
03.01.2020, 17:46 6
qll, функция ReadFile() не зависит от UNICODE. Она одна на все случаи жизни
Другими словами, ReadFileA() не существует! Вы хоть пробовали подсунуть студии это имя?
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
03.01.2020, 18:04  [ТС] 7
liv, да, уже понял. Глупые ошибки, как всегда

Добавлено через 4 минуты
liv, однако, проблема остается. Файле содержится несколько строк. А он не читает все строки. Не знаю, почему. И прямо чую, что что-то неладное с char* text...
0
Заблокирован
03.01.2020, 18:06 8
Цитата Сообщение от liv Посмотреть сообщение
Вы хоть пробовали подсунуть студии
само-собой тестовый проект
0
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
03.01.2020, 18:10 9
BlackStoneBlack, файл читается как есть, со всеми 0x0d, 0x0a. Получается, как один массив, одна строка, в конце которой записан терминальный нуль. Посмотрите в отладчике.
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
03.01.2020, 18:17  [ТС] 10
liv, тем не менее, Visual Studio 2019 ругается:
Предупреждение C6031 Возвращаемое значение пропущено: "ReadFile".

Добавлено через 2 минуты
liv, тогда ещё вопрос: корректно ли я, за неимением лучшего термина, привожу char* к string?

Добавлено через 38 секунд
Просто дальше идёт работа именно с переменной line, как со строкой.
0
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
03.01.2020, 18:20 11
BlackStoneBlack, да корректно все.
Что находится в переменной bytes? Там находится количество прочитанных байт.
Т.е. должно быть bytes == size
а ReadFile() возвращает BOOL, как результат выполнения. В принципе, можно проверить
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
03.01.2020, 18:24  [ТС] 12
liv, всё, разобрался. Снова глупая ошибка в дальнейшей обработке строки. К теме уже не относится. Спасибо за помощь
0
Эксперт CЭксперт С++
5118 / 4558 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
03.01.2020, 18:25 13
BlackStoneBlack, ну и славно
0
Эксперт С++
3701 / 2835 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 22
04.01.2020, 19:04 14
Цитата Сообщение от qll Посмотреть сообщение
использовать функции явно: ReadFileA
прежде чем чушь нести, удосужился бы посмотреть экспорт kernelbase.dll
ReadFile и ReadFileEx - это то, что получает система в нативе от юзера

возможно ты спутал её с функцией CreateFile - вот она экспортируется и как юникодная (CreateFileW), и как многобайтовая (CreateFileA).
1
04.01.2020, 19:04
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2020, 19:04
Помогаю со студенческими работами здесь

Чтение из файла, не используя getline
Вот ВЕСЬ код: #include <iostream> #include <string> #include <fstream> #include <iomanip>...

Чтение файла используя методы TextIO
Привет! Ребята, помогите пожалуйста. В универе дали задание, прочитать файл и посчитать...

Чтение файла используя динамический массив
Выполнить задание по чтению файла используя динамический массив. То есть, нужно написать код,...

Построчное чтение из файла используя TStringList
Пожалуйста, подскажите дураку, как тут организовать построчное чтение? Прочитала уже безумное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Что такое хорошо и что такое плохо, вид сбоку. Индивид и общество - грань не нарушения.
Hrethgir 18.01.2025
В моей личной жизни и времени, я рассуждаю категорией "хуже-лучше", в том плане, когда меня спросили например - "а зачем ты делаешь свой процессор?", то я ответил - "чтобы сделать свою жизнь лучше". . .
Передача по ссылке или по значению в Java?
InfoMaster 18.01.2025
В мире программирования на Java одним из ключевых аспектов, требующих глубокого понимания, является механизм передачи параметров в методы. Этот фундаментальный концепт часто становится источником. . .
Тернарный условный оператор в Python
InfoMaster 18.01.2025
В мире программирования существует множество инструментов и конструкций, позволяющих создавать эффективный и лаконичный код. Одним из таких инструментов является тернарный условный оператор, который. . .
Как удалить неотслеживаемые файлы из рабочего дерева Git
InfoMaster 18.01.2025
В процессе разработки программного обеспечения с использованием системы контроля версий Git часто возникает необходимость в управлении неотслеживаемыми файлами. Неотслеживаемые файлы (untracked. . .
Что делает код if __name__ == "__main__": в Python
InfoMaster 18.01.2025
В мире программирования на Python существует множество важных концепций, и одной из наиболее интересных является конструкция if __name__ == "__main__". Эта специальная конструкция играет ключевую. . .
Как заставить Git забыть об отслеживаемом файле, добавленном в .gitignore
InfoMaster 18.01.2025
В мире разработки программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, позволяя эффективно отслеживать изменения в коде и управлять ими. Однако. . .
Что означает use strict в JavaScript и для чего используется
InfoMaster 18.01.2025
В мире современной веб-разработки JavaScript играет ключевую роль как один из основных языков программирования. По мере его эволюции возникла необходимость в механизмах, которые помогли бы. . .
Как работать со скрытыми (hidden) элементами в jQuery
InfoMaster 18.01.2025
В современной веб-разработке управление видимостью элементов на странице является одним из ключевых аспектов создания интерактивных пользовательских интерфейсов. jQuery предоставляет мощный набор. . .
Как переключаться между ветками (Branch) с помощью checkout в Git
InfoMaster 18.01.2025
Ветки в Git являются одной из ключевых концепций для управления версионностью кода, позволяя разработчикам эффективно работать в команде и параллельно развивать программные проекты. Каждый новый. . .
Что такое стек и куча, чем они отличаются и где находятся
InfoMaster 18.01.2025
Понимание основных концепций памяти в программировании В мире современного программирования эффективное управление памятью играет ключевую роль в создании производительных и надежных приложений. . . .
Как использовать комментарии в JSON
InfoMaster 18.01.2025
JSON (JavaScript Object Notation) представляет собой легкий и широко используемый формат обмена данными, который стал стандартом де-факто для веб-приложений и программных интерфейсов. При работе с. . .
Как заставить git pull перезаписать локальные файлы в Git
InfoMaster 18.01.2025
Проблема перезаписи локальных файлов в Git При работе с системой контроля версий Git разработчики часто сталкиваются с ситуацией, когда необходимо синхронизировать локальный репозиторий с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru