Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлами средствами Win API

23K
14 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Помгите пжласт понять почему не работает следующий код:

 
Код:
HANDLE hFile;
    char* pcData = "test";
    LPDWORD i = NULL;
    hFile = CreateFileA("C:\test.dat",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,pcData,sizeof(pcData),i,NULL);
    CloseHandle(hFile);
5
14 марта 2009 года
hardcase
4.5K / / 09.08.2005
 
Код:
HANDLE hFile;
    char* pcData = "test";
    LPDWORD i = NULL;
    hFile = CreateFileA("C:[COLOR=Red]\\[/COLOR]test.dat",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,pcData,sizeof(pcData),i,NULL);
    CloseHandle(hFile);
Кроме того sizeof(pcData) вернет размер указателя, но не строки: для 32битной программы он будет 4, для 64-битной - 8.
23K
14 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
исправил так:

 
Код:
HANDLE hFile;
    char* pcData = "test";
    LPDWORD i = NULL;
    hFile = CreateFileA("C:\\test.dat",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,pcData,sizeof(*pcData),i,NULL);
    CloseHandle(hFile);


Но на строке WriteFile всеравно ошибка:
Unhandled exception at 0x7c810e9c in lab5.exe: 0xC0000005: Access violation writing location 0x00000000.
7
14 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Видимо,потому,что число записанных байт пишется по адресу i,который в данном случае равен NULL.Поэтому-то в тексте ошибки "Access violation writing location [COLOR="Red"]0x00000000[/COLOR]"
23K
14 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Можно тогда поподробней объяснить для чего 4-ый параметр и что туда надо передавать, чтобы запись в файл прошла корректно.

В книге которую я читаю написано: "После того как функция выполнит свою работу, в буфер, на котрый указывает четвертый аргумент, будет записано число байтов, записанных в файл". Либо я что-то не так понимаю, либо в книге вранье (что в наше время не удивительно, книги пишут все кому не лень).
1.9K
14 марта 2009 года
andriano
474 / / 10.01.2008
Наверное первое, т.к. то, что ты передаешь в качестве четвертого аргумента, при самой больной фантазии тяжело назвать буфером.
В конце концов, если возникают подозрения, что в книге написано что-то не то, можно справиться по другому источнику, хотя бы по MSDN.
23K
14 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Все проблему наконец удалось решить. Всем спасибо.

Кому интересно, конечный вариант:
 
Код:
HANDLE hFile;
    char* pcData = "test";
    DWORD i = 0;
    hFile = CreateFileA("C:\\test.dat",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,pcData,sizeof(*pcData),
        &i,NULL);
    CloseHandle(hFile);
5
15 марта 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Inc(Dec(i))
Все проблему наконец удалось решить.

:D

Вопрос на 100 рублей. Чему будет равно x?

 
Код:
char* pcData = "a bit longer string";
int x = sizeof(*pcData);
7
15 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Позволь угадать(ибо знаний по вопросу у меня не особо много,да я и не испытывал;просто наугад)…
x будет равно 4?:)
261
15 марта 2009 года
ahilles
1.5K / / 03.11.2005
так надо.
 
Код:
HANDLE hFile;
    char* pcData = "test";
    DWORD i = 0;
    hFile = CreateFileA("C:\\test.dat",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    WriteFile(hFile,pcData,lstrlen(pcData), &i,NULL);
    CloseHandle(hFile);
341
15 марта 2009 года
Der Meister
874 / / 21.12.2007
Цитата: @pixo $oft
Позволь угадать(ибо знаний по вопросу у меня не особо много,да я и не испытывал;просто наугад)…
x будет равно 4?:)


Садись, два :D
hardcase, кажется, разбогател на сотку :)

7
15 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Так я что,оказался неправ?:confused:Как тогда правильно ответить было?

P.S.Вообще-то hardcase предлагал деньги тому,кто найдёт ответ.Сам он пока что не ответил,так что…:)
240
16 марта 2009 года
aks
2.5K / / 14.07.2006
Мне вот интересно откуда вобще взялась эта идея sizeof тут использовать? )
Нет, там бы еще в первом случае это прокатило бы, еслиб тип у переменной pcData был не указатель, а массив (каким он и должен быть по присваиванию строковой константы). Поскольку все же sizeof(char) всегда равен еденице. Сколько бы байт или другой меры памяти char не занимал.
Соотвественно, как не трудно догадаться sizeof(*pcData) равный sizeof(char) тоже еденица.
23K
16 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Ну ступил))) бывает.... Кстати lstrlen(pcData) не работает, так как у меня не юникод, взял просто strlen(pcData)
23K
16 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Господа, снова прошу вашей помощи, что-то нехотят файлы со мной упорно дружить. Подскажите что не так на этот раз. Пытаюсь прочитать файл побайтово в buffer, пока не встретится признак переноса каретки, но в цикле bufer остается неизменным. Код ниже:

 
Код:
HANDLE hFile;
    hFile = CreateFileA("C:\\test.txt",GENERIC_READ,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    DWORD i = 0;
    char buffer[1] = "";
    while (buffer != "\n")
        ReadFile(hFile,buffer,1,&i,NULL);
    CloseHandle(hFile);
7
16 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Может,всё-таки
Цитата: Inc(Dec(i))
 
Код:

ReadFile(hFile,[COLOR="Red"]&buffer[/COLOR],1,&i,NULL);

Удивляюсь,как приложение у тебя не падало при этом–там ведь адрес буфера должен быть,а не сам буфер
За доп. информацией смотри мою подпись–там порой попадается что-нибудь ооочень интересное;)

P.S.Может,какое преобразование типов понадобится–в этих вещах я не особо,но вот то,что там всё-таки указатель–это точно!

1.6K
16 марта 2009 года
Vov4ick
476 / / 01.02.2007
Inc(Dec(i)) хочу посоветовать: пользуйся функцией GetLastError, чтобы не спрашивать по пустякам. Также внимательней читай документацию.
Тебе надо не создавать файл, а читать. Поэтому нужно передавать параметр OPEN_EXISTING функции CreateFile.

Цитата:
этом–там ведь адрес буфера должен быть,а не сам буфер


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

23K
16 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Vov4ick спасибо. Работает. Блин ток вот это... хотел тебя в карму поблагодорить, а вышло наоборот, промазал чуток)))) сорри)))
7
16 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Да,power–это круто:),только в виду имелся MSDN
А вот то,что ты указал Create_Always,я как-то пропустил…Там нужен 1 из флагов открытия–или OpenExisting(как было указано выше),или Open_Always(это уж от задачи зависит)

P.S.Побайтовое чтение–не Бог весть какая долгая операция.Поэтому рекомендую читать в буфер побольше,а уж потом искать CRLF.Надеюсь,моя рекомендация поможет:rolleyes:
23K
16 марта 2009 года
Inc(Dec(i))
61 / / 13.02.2009
Тру. Всем спасибо за советы.
240
17 марта 2009 года
aks
2.5K / / 14.07.2006
Цитата: Inc(Dec(i))
Господа, снова прошу вашей помощи, что-то нехотят файлы со мной упорно дружить.



>:E

 
Код:
while (buffer != "\n")

Здесь сравниваешь адреса двух указателей, а не значения символов.
Хочешь символы сравнивать - так и пиши. '\n' != buffer[0]
И вобще, неплохо было бы хоть какую то литературу по языку именно почитать, а не по API. У тебя тут все проблемы из-за вопиющего незнания основ языка. )



Цитата: @pixo $oft
Может,всё-такиУдивляюсь,как приложение у тебя не падало при этом–там ведь адрес буфера должен быть,а не сам буфер


Тыб тоже не советовал бы такое, пока сам не разобрался. То что ты посоветовал - это жесть, которая приведет к порче памяти. ) Ибо писаться будет по аресу массива - по сути будет затирать значения указателя, а потом пойдет портить память дальше. )

7
23 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
И вот что самое странное…На почту пришло оповещение о том,что было написано сообщение "не могу найти описание функции CreateFileA";примерно так.Захожу в тему–нет такого собщения
Ну что ж,отвечу незнакомцу:):буква A или W на конце соответствует ANSI и Unicode-версиям данной функции.Поэтому в MSDN надо искать название без окончания,остальное определяется спецификой работы программы
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог