Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2014, 08:19   #1
v0id_
Новичок
Джуниор
 
Регистрация: 21.10.2014
Сообщений: 5
По умолчанию Чтение из файла

Есть такой код

Код:
char buf[128];
		
HANDLE File = CreateFile((LPWSTR)buf, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
LPVOID cBufferText = "TTTTESTTTT";
LPDWORD writtenStr = NULL;
char* buf2[20];
DWORD HH;
SetFilePointer(File, 0, 0, FILE_BEGIN);
ReadFile(File, buf2, sizeof(buf2)*2+1, &HH, NULL);
MessageBox(hWnd, (LPCWSTR)HH, L"текст", MB_OK);
WriteFile(File, cBufferText, sizeof(cBufferText)* 2 + 1, &HH, NULL);
SetEndOfFile(File);
CloseHandle(File);
Запись работает, а чтение нет. Перепробовал разные варианты, иногда пишет иероглифы, иногда ничего ( в данном варианте - ничего)
v0id_ вне форума Ответить с цитированием
Старый 21.10.2014, 08:44   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вот вы написали LPVOID, а посмотрели хотя бы что это за тип? Чему будет сайзоф от него?
p51x вне форума Ответить с цитированием
Старый 21.10.2014, 08:56   #3
v0id_
Новичок
Джуниор
 
Регистрация: 21.10.2014
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вот вы написали LPVOID, а посмотрели хотя бы что это за тип? Чему будет сайзоф от него?
ну.. дальний указатель на любой тип... сайзоф почему-то получается 4 байта, но с LPVOID cBufferText проблем нет, и текст записывается в файл. Только не читается из файла в дальнейшем.

Мне казалось ReadFile должна писать данные из файла в переданный буфер, пробовал так
LPDWORD writtenStr[128];
ReadFile(File, writtenStr, sizeof(writtenStr)* 2 + 1, &HH, NULL);
MessageBox(hWnd, (LPCWSTR)writtenStr, L"текст", MB_OK);

но только иероглифы (я так понимаю рандомный мусор из памяти)

Последний раз редактировалось v0id_; 21.10.2014 в 09:11.
v0id_ вне форума Ответить с цитированием
Старый 21.10.2014, 10:45   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы что как текст выводите то?

скажу по опыту, если вам приходится ставить явное приведение типов, то 90% что вы делаете что-то не так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.10.2014, 10:45   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
сайзоф почему-то получается 4 байта
Ой, да ну... Почему-то... Может потому что размер 32битного указателя 32 бита?

Цитата:
Мне казалось ReadFile должна писать данные из файла в переданный буфер
Так и делает.

Цитата:
пробовал так
Нус...

Код:
LPDWORD writtenStr[128];
Какой тип будет иметь каждый элемент массива?

Код:
ReadFile(File, writtenStr, sizeof(writtenStr)* 2 + 1, &HH, NULL);
Так сколько вы хотите прочитать? Что за странные расчеты?

Код:
MessageBox(hWnd, (LPCWSTR)writtenStr, L"текст", MB_OK);
Как у вас DWORD'ы превратились в строку?

Где контроль ошибок?
p51x вне форума Ответить с цитированием
Старый 21.10.2014, 11:42   #6
v0id_
Новичок
Джуниор
 
Регистрация: 21.10.2014
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а вы что как текст выводите то?

скажу по опыту, если вам приходится ставить явное приведение типов, то 90% что вы делаете что-то не так.
указываю путь к файлу в текстбоксе и текст в месседж бокс вывожу пока что...

без приведения типов не получается, пробовал LPCWSTR writtenStr[128] и разыменовать указатель - вообще с ошибкой завершается выполнение

Цитата:
Сообщение от p51x Посмотреть сообщение
Ой, да ну... Почему-то... Может потому что размер 32битного указателя 32 бита?
ну я не помню просто размеры всех этих типов, от силы неделю назад на с++ начал писать
просто сначала думал, что сайзоф размер всего массива вернёт...


Цитата:
Какой тип будет иметь каждый элемент массива?
LPDWORD

Цитата:
Так сколько вы хотите прочитать? Что за странные расчеты?
Всё что в файле. По другому у меня просто только первые 4 символа записываются. Во всех примерах, что находил, сайзоф длину всего буфера давал, а у меня только указателя... Поэтому пока оставил так, ибо работает...

Цитата:
Как у вас DWORD'ы превратились в строку?
а.. ну да.. ну тогда непонятно как строку сделать LPCWSTR, получается только LPCWSTR*...

Цитата:
Где контроль ошибок?
в компиляторе

Последний раз редактировалось Stilet; 21.10.2014 в 14:09.
v0id_ вне форума Ответить с цитированием
Старый 21.10.2014, 13:07   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от v0id_ Посмотреть сообщение
ну я не помню просто размеры всех этих типов, от силы неделю назад на с++ начал писать
просто сначала думал, что сайзоф размер всего массива вернёт...
Так зачем вы ему указатель подсовываете, а не массив тогда?

Цитата:
Сообщение от v0id_ Посмотреть сообщение
LPDWORD
И? Что это за тип? Что за строка состоит из "букв" этого типа?

Цитата:
Сообщение от v0id_ Посмотреть сообщение
Всё что в файле. По другому у меня просто только первые 4 символа записываются.
Значит сначала надо этот размер получить или читать заведомо больше и смотреть сколько прочиталось реально. А массив то у вас не безразмерный все-таки...

Цитата:
Сообщение от v0id_ Посмотреть сообщение
а.. ну да.. ну тогда непонятно как строку сделать LPCWSTR, получается только LPCWSTR*...
А вы разберитесь, что это за тип. Ну не понимаете вы указателей зачем вставляете их во все дыры? Берите базовые типы, а где требуются указатели для функции есть вот такая фиговина &

Цитата:
Сообщение от v0id_ Посмотреть сообщение
в компиляторе
Как компилятор узнает, что файла в момент работы программы нет?
Как компилятор узнает, что прав для чтения файла в момент работы программы нет?
Как компилятор узнает, что файл битый (нулевой длины) в момент работы программы?
...
p51x вне форума Ответить с цитированием
Старый 21.10.2014, 13:51   #8
v0id_
Новичок
Джуниор
 
Регистрация: 21.10.2014
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Так зачем вы ему указатель подсовываете, а не массив тогда?
sizeof принимает указатель LPVOID, если массив то ошибка...


Цитата:
И? Что это за тип? Что за строка состоит из "букв" этого типа?
дальний указатель на двойное слово, строка - массив константных char'ов. Они же 1 байт, в двойное слово должны без проблем преобразоваться... наверное.


Цитата:
Значит сначала надо этот размер получить или читать заведомо больше и смотреть сколько прочиталось реально. А массив то у вас не безразмерный все-таки...
ну я просто взял с запасом с рассчётом, что ReadFile запишет в буфер реальный размер



Цитата:
А вы разберитесь, что это за тип. Ну не понимаете вы указателей зачем вставляете их во все дыры? Берите базовые типы, а где требуются указатели для функции есть вот такая фиговина &
ну я пробовал ссылки, но не получилось.. проблема в том, что я не понимаю почему ReadFile не читает в буфер текст... ведь он во второй параметр пишет результат, да?

Цитата:
Как компилятор узнает, что файла в момент работы программы нет?
Как компилятор узнает, что прав для чтения файла в момент работы программы нет?
Как компилятор узнает, что файл битый (нулевой длины) в момент работы программы?
ну я пока не делал обработку исключений, потому что это черновой вариант. Если весь функционал, который планирую, получится сделать, тогда перепишу с деталями.
v0id_ вне форума Ответить с цитированием
Старый 21.10.2014, 15:04   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
sizeof принимает указатель LPVOID
А еще в С++ есть куча функции, принимающих тип Т? Не хотите создать переменную этого типа?

Цитата:
дальний указатель на двойное слово, строка - массив константных char'ов. Они же 1 байт, в двойное слово должны без проблем преобразоваться...
Прочитайте еще раз, что сами написали - массив указателей преобразуется в массив чаров

Цитата:
ну я пробовал ссылки, но не получилось..
Это не ссылка, а взятие адреса.

Цитата:
ну я пока не делал обработку исключений, потому что это черновой вариант.
Т.е. если ридфайл не читает файл потому, что креатеатефайл не смогла его открыть (лежит не в той папке), а вы тут корячитесь - это исключение, которое надо контролировать потом?
p51x вне форума Ответить с цитированием
Старый 21.10.2014, 15:32   #10
v0id_
Новичок
Джуниор
 
Регистрация: 21.10.2014
Сообщений: 5
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А еще в С++ есть куча функции, принимающих тип Т? Не хотите создать переменную этого типа?
посмотрю... не очень помню её так сразу..


Цитата:
Прочитайте еще раз, что сами написали - массив указателей преобразуется в массив чаров
а да... тут вроде исправил


Цитата:
Это не ссылка, а взятие адреса.
ну да, просто где-то прочитал это под термином "ссылка"


Цитата:
Т.е. если ридфайл не читает файл потому, что креатеатефайл не смогла его открыть (лежит не в той папке), а вы тут корячитесь - это исключение, которое надо контролировать потом?
файл у меня создан и я только к нему обращаюсь, try{}catch(){} потом недолго добавить, просто если не смогу исправить чтение, то и обрабатывать будет нечего)
v0id_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла V1rus.25 Помощь студентам 9 15.04.2013 17:10
Чтение из файла virtuhay266 Помощь студентам 0 27.11.2010 23:27
С++ Чтение из файла sir.andrey Помощь студентам 9 15.10.2010 16:00
чтение файла Serjuk Помощь студентам 1 15.05.2010 20:42
чтение файла Arteom Общие вопросы Delphi 6 27.08.2007 18:15