Работа с файлами средствами Win API
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);
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);
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.
В книге которую я читаю написано: "После того как функция выполнит свою работу, в буфер, на котрый указывает четвертый аргумент, будет записано число байтов, записанных в файл". Либо я что-то не так понимаю, либо в книге вранье (что в наше время не удивительно, книги пишут все кому не лень).
В конце концов, если возникают подозрения, что в книге написано что-то не то, можно справиться по другому источнику, хотя бы по MSDN.
Кому интересно, конечный вариант:
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);
:D
Вопрос на 100 рублей. Чему будет равно x?
int x = sizeof(*pcData);
x будет равно 4?:)
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);
x будет равно 4?:)
Садись, два :D
hardcase, кажется, разбогател на сотку :)
P.S.Вообще-то hardcase предлагал деньги тому,кто найдёт ответ.Сам он пока что не ответил,так что…:)
Нет, там бы еще в первом случае это прокатило бы, еслиб тип у переменной pcData был не указатель, а массив (каким он и должен быть по присваиванию строковой константы). Поскольку все же sizeof(char) всегда равен еденице. Сколько бы байт или другой меры памяти char не занимал.
Соотвественно, как не трудно догадаться sizeof(*pcData) равный sizeof(char) тоже еденица.
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);
ReadFile(hFile,[COLOR="Red"]&buffer[/COLOR],1,&i,NULL);
…
Удивляюсь,как приложение у тебя не падало при этом–там ведь адрес буфера должен быть,а не сам буфер
За доп. информацией смотри мою подпись–там порой попадается что-нибудь ооочень интересное;)
P.S.Может,какое преобразование типов понадобится–в этих вещах я не особо,но вот то,что там всё-таки указатель–это точно!
Тебе надо не создавать файл, а читать. Поэтому нужно передавать параметр OPEN_EXISTING функции CreateFile.
Компилятор Ц достаточно умный, чтобы соотнести требуемый тип параметра функции с тем, что написал пользователь. Скорей всего, даже варнинга не было.
А вот то,что ты указал Create_Always,я как-то пропустил…Там нужен 1 из флагов открытия–или OpenExisting(как было указано выше),или Open_Always(это уж от задачи зависит)
P.S.Побайтовое чтение–не Бог весть какая долгая операция.Поэтому рекомендую читать в буфер побольше,а уж потом искать CRLF.Надеюсь,моя рекомендация поможет:rolleyes:
>:E
Здесь сравниваешь адреса двух указателей, а не значения символов.
Хочешь символы сравнивать - так и пиши. '\n' != buffer[0]
И вобще, неплохо было бы хоть какую то литературу по языку именно почитать, а не по API. У тебя тут все проблемы из-за вопиющего незнания основ языка. )
Тыб тоже не советовал бы такое, пока сам не разобрался. То что ты посоветовал - это жесть, которая приведет к порче памяти. ) Ибо писаться будет по аресу массива - по сути будет затирать значения указателя, а потом пойдет портить память дальше. )
Ну что ж,отвечу незнакомцу:):буква A или W на конце соответствует ANSI и Unicode-версиям данной функции.Поэтому в MSDN надо искать название без окончания,остальное определяется спецификой работы программы