<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Языки программирования скачать</title>
	<atom:link href="http://about-programming.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://about-programming.ru</link>
	<description>Все о программировании - языки программирования скачать (Basic, C, C++, C#, Delphi, Pascal, Java, PHP)</description>
	<lastBuildDate>Fri, 26 Feb 2010 21:11:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Как узнать IP и MAC адрес своего компьютера на C++</title>
		<link>http://about-programming.ru/ccc/591.html</link>
		<comments>http://about-programming.ru/ccc/591.html#comments</comments>
		<pubDate>Mon, 04 Jan 2010 19:33:08 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[IP адрес]]></category>
		<category><![CDATA[MAC адрес]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=591</guid>
		<description><![CDATA[Как узнать IP и MAC адрес моего компа в сети на C++
Для определения мы будем пользоваться функциями gethostname и gethostbyname из библиотеки winsock.h. Если у вас два и более сетевых подключений, программа покажет IP адрес первого в очереди.
#include &#60;winsock.h&#62;
#include &#60;windows.h&#62;
int main (int argc, char* argv[])
{
const int WSVer  =  0×101;
WSAData wsaData;
hostent *h;
char Buf[128];
if  [...]]]></description>
			<content:encoded><![CDATA[<h3>Как узнать IP и MAC адрес моего компа в сети на C++</h3>
<p>Для определения мы будем пользоваться функциями <strong>gethostname</strong> и <strong>gethostbyname</strong> из библиотеки <strong>winsock.h.</strong> Если у вас два и более сетевых подключений, программа покажет <strong>IP адрес</strong> первого в очереди.<span id="more-591"></span></p>
<blockquote><p><strong>#include &lt;winsock.h&gt;<br />
#include &lt;windows.h&gt;</strong></p>
<p><strong>int main (int argc, char* argv[])<br />
{<br />
const int WSVer  =  0×101;<br />
WSAData wsaData;<br />
hostent *h;<br />
char Buf[128];<br />
if  (WSAStartup (WSVer,  &amp;wsaData)  ==  0)<br />
{<br />
if (gethostname (&amp;Buf[0],  128)  ==  0)<br />
{<br />
h = gethostbyname (&amp;Buf[0]);<br />
if  (h  !=  NULL)      MessageBox (0,inet_ntoa (*(reinterpret_cast&lt;in_addr *&gt;(*(h-&gt;h_addr_list)))),0,0);<br />
else             MessageBox (0,&raquo;Вы не в сети. И IP адреса у вас нет.&raquo;,0,0);<br />
}<br />
WSACleanup;<br />
}<br />
return 0;<br />
}</strong></p></blockquote>
<p>Также можно воспользоваться WinAPI функцией <strong>GetAdaptersInfo</strong>. Она тебе вернет информацию по всем сетевым адаптерам системы.WinAPI фукнции очень полезная вещь, рекомендую тебе почаще листать справочник.</p>
<p><strong><a href="http://about-programming.ru/ccc/591.html">Узнать MAC адрес</a></strong> можно как предыдущим способом, с помощью <strong>GetAdaptersInfo</strong>. Но также и другим:</p>
<blockquote><p><strong>#include &lt;stdio.h&gt;<br />
#include &lt;windows.h&gt;<br />
#include &lt;Winsock2.h&gt;<br />
#include &lt;Iphlpapi.h&gt;</strong></p>
<p><strong>///&#8212;&#8212;&#8211; cpp-файл &#8212;&#8212;&#8212;- </strong></p>
<p><strong>#include «stdafx.h»<br />
char ip[]=&raquo;192.168.100.1&#8243;;</strong></p>
<p><strong>int main (int argc, char* argv[])<br />
{<br />
//Будем использовать сокеты<br />
WSADATA WsaData;<br />
DWORD _ip=inet_addr (ip);<br />
if (WSAStartup (0×0202, &amp;WsaData)==NULL)<br />
printf («WSA Starup OK!\n»);</strong></p>
<p><strong>//Создаём UDP-сокет и отсылаем по нему любые данные<br />
SOCKET udp_s;<br />
SOCKADDR_IN udp_sin;<br />
udp_s=socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);<br />
if (udp_s!=SOCKET_ERROR)<br />
{<br />
udp_sin.sin_family = AF_INET;<br />
udp_sin.sin_port = htons (5232); //Шлём на любой порт.<br />
udp_sin.sin_addr.s_addr = _ip;<br />
if (sendto (udp_s, «TEST», 5, NULL, (SOCKADDR*)&amp;udp_sin, sizeof (udp_sin))&gt;0)<br />
{ //Пакет отослан. Вытаскиваем MAC-адрес из системы<br />
MIB_IPNETTABLE * pIpNetTable = (MIB_IPNETTABLE *) new char[0xFFFF];<br />
ULONG cbIpNetTable = 0xFFFF;<br />
if (NO_ERROR == GetIpNetTable (pIpNetTable, &amp;cbIpNetTable, TRUE))<br />
{<br />
for (DWORD i = 0; i &lt; pIpNetTable-&gt;dwNumEntries; i++)<br />
{<br />
if (pIpNetTable-&gt;table[i].dwAddr == _ip&amp;&amp;pIpNetTable-&gt;table[i].dwType != 2)<br />
{<br />
printf («IP:%s MAC:%X-%X-%X-%X-%X-%X\n», ip,<br />
pIpNetTable-&gt;table[i].bPhysAddr[0],<br />
pIpNetTable-&gt;table[i].bPhysAddr[1],<br />
pIpNetTable-&gt;table[i].bPhysAddr[2],<br />
pIpNetTable-&gt;table[i].bPhysAddr[3],<br />
pIpNetTable-&gt;table[i].bPhysAddr[4],<br />
pIpNetTable-&gt;table[i].bPhysAddr[5]);<br />
delete[] pIpNetTable;<br />
closesocket (udp_s);<br />
WSACleanup ();<br />
return 0;<br />
}<br />
}<br />
printf («MAC-address not found\n»);<br />
delete[] pIpNetTable;<br />
}<br />
else printf («ERROR Open IPMAC table\n»);<br />
}<br />
else printf («Send data ERROR!\n»);</strong></p>
<p><strong>closesocket (udp_s);<br />
}<br />
else printf («ERROR open socket\n»);</strong></p>
<p><strong>WSACleanup ();         //Освобождаем ресурсы<br />
return 0;<br />
}</strong>﻿</p></blockquote>
<p>Мой блог находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru">языки программирования</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/591.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Особенности копирования текста страницы в CppWebBrowser на C++ Builder</title>
		<link>http://about-programming.ru/ccc/586.html</link>
		<comments>http://about-programming.ru/ccc/586.html#comments</comments>
		<pubDate>Sat, 02 Jan 2010 14:05:41 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[CppWebBrowser]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=586</guid>
		<description><![CDATA[В интернете выложено несколько похожих способов копирования текста (ну или html-текста, не суть) с компоненты CppWebBrowser.
Я использовал следующий рабочий вариант копирования html-текста в Memo:

IHTMLDocument2 *HTMLDocument = NULL;
IPersistFile *PersistFile = NULL;
LONG ilFramesCount = 0;
AnsiString slTmpFileExtension = ".html";
// Falls eine Seite geladen:
if(!Form1->CppWebBrowser1->Busy &#038;&#038; Form1->CppWebBrowser1->Document &#038;&#038;
AnsiString(Form1->CppWebBrowser1->LocationURL) != "about:blank" &#038;&#038;
SUCCEEDED(Form1->CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&#038;HTMLDocument)))
{
// HTML-Code des Hauptdokuments speichern:
     [...]]]></description>
			<content:encoded><![CDATA[<p>В интернете выложено несколько похожих способов копирования текста (ну или html-текста, не суть) с компоненты <strong><a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a></strong>.<br />
Я использовал следующий рабочий вариант копирования html-текста в Memo:<span id="more-586"></span></p>
<p><code><br />
IHTMLDocument2 *HTMLDocument = NULL;<br />
IPersistFile *PersistFile = NULL;<br />
LONG ilFramesCount = 0;<br />
AnsiString slTmpFileExtension = ".html";<br />
// Falls eine Seite geladen:<br />
if(!Form1-><strong>CppWebBrowser</strong>1->Busy &#038;&#038; Form1-><strong>CppWebBrowser</strong>1->Document &#038;&#038;<br />
AnsiString(Form1-><strong>CppWebBrowser</strong>1->LocationURL) != "about:blank" &#038;&#038;<br />
SUCCEEDED(Form1-><strong>CppWebBrowser</strong>1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&#038;HTMLDocument)))<br />
{<br />
// HTML-Code des Hauptdokuments speichern:<br />
       if(SUCCEEDED(HTMLDocument->QueryInterface(IID_IPersistFile,(LPVOID*)&#038;PersistFile)))<br />
       {<br />
               // HTML-Code des Hauptdokuments speichern:<br />
               PersistFile->Save(WideString(String(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension)), false);<br />
               PersistFile->Release();<br />
               // ggf. auch Frames-Code extrahieren:<br />
               IHTMLFramesCollection2 *pFrames = NULL;<br />
               if(SUCCEEDED(HTMLDocument->get_frames(&#038;pFrames)))<br />
               {<br />
               // Anzahl der Frames bestimmen:<br />
               pFrames->get_length(&#038;ilFramesCount);<br />
               if(ilFramesCount < 2) ilFramesCount= 0;<br />
               VARIANT vFrame;<br />
               VARIANT ret;<br />
               vFrame.vt = VT_UINT;<br />
               // f?r jedes Frame:<br />
               for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)<br />
               {<br />
                       vFrame.lVal = ilFrameIndex;<br />
                       if(SUCCEEDED(pFrames->item(&#038;vFrame, &#038;ret)))<br />
                       {<br />
                               // Zeiger auf IHTMLWindow2 des Frames besorgen:<br />
                               IHTMLWindow2 *pWindow = NULL;<br />
                               if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,<br />
                               (LPVOID*)&#038;pWindow)))<br />
                               {<br />
                                       // Zeiger auf IHTMLDocument2 des Frames besorgen:<br />
                                       IHTMLDocument2 *pDoc = NULL;<br />
                                       if(SUCCEEDED(pWindow->get_document(&#038;pDoc)))<br />
                                       {<br />
                                               // Frame in der Datei "Framenummer.html" speichern:<br />
                                               IPersistFile *PersistFile = NULL;<br />
                                               if(SUCCEEDED(pDoc->QueryInterface(IID_IPersistFile,<br />
                                               (LPVOID*)&#038;PersistFile)))<br />
                                               {<br />
                                                       PersistFile->Save(WideString(String(ExtractFilePath(ParamStr(0))+<br />
                                                       IntToStr(ilFrameIndex+1) + slTmpFileExtension)), false);<br />
                                                       PersistFile->Release();<br />
                                               }<br />
                                               pDoc->Release();<br />
                                       }<br />
                                       pWindow->Release();<br />
                               }<br />
                       }<br />
               }<br />
               pFrames->Release();<br />
       }<br />
}<br />
HTMLDocument->Release();<br />
TStringList* pFileStrings = new TStringList;<br />
if(pFileStrings)<br />
{<br />
// Die gepufferten Dateien mit dem HTML-Code der<br />
// Seite in die RichEdit einlesen und die Dateien l?schen:<br />
       if(FileExists(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension))<br />
               {<br />
                       Form1->Memo1->Lines->LoadFromFile(ExtractFilePath(<br />
                       ParamStr(0))+"0"+slTmpFileExtension);<br />
                       DeleteFile(ExtractFilePath(ParamStr(0))+"0"+slTmpFileExtension);<br />
               }<br />
       if(ilFramesCount > 0)<br />
               {<br />
               for(LONG ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)<br />
                       {<br />
                               if(FileExists(ExtractFilePath(ParamStr(0))+IntToStr(<br />
                               ilFrameIndex+1) + slTmpFileExtension))<br />
                               {<br />
                                       pFileStrings->LoadFromFile(ExtractFilePath(ParamStr(0))+<br />
                                       IntToStr(ilFrameIndex+1) + slTmpFileExtension);<br />
                                       Form1->Memo1->Lines->Add("\n- - - Frame " +<br />
                                       IntToStr(ilFrameIndex+1) + " - - -");<br />
                                       Form1->Memo1->Lines->Add(pFileStrings->Text);<br />
                                       DeleteFile(ExtractFilePath(ParamStr(0))+IntToStr(<br />
                                       ilFrameIndex+1) + slTmpFileExtension);<br />
                               }<br />
                       }<br />
               }<br />
       delete pFileStrings;<br />
       }<br />
}<br />
else Form1->Memo1->Lines->Clear();<br />
</code></p>
<p>Проблема в следующем&#8230; Текст извлекаю из известного сайта vkontakte.ru. Предположим, захожу в поиск людей.. мне выводится несколько страниц, к примеру по 10 человек. Копирую текст для первых 10 &#8211; всё Ок. А вот если хочу скопировать текст для следущих 10 найденных, то копируется текст снова для первых 10 В код копирования страницы не вникал ибо не особо в этих приёмах разбираюсь, а если начну разбираться то уйдёт на это много времени&#8230;<br />
Вопрос в следующем: можно как-нибудь подправить этот код или может, кто в работе с html страницами хорошо разбирается, предложит свой вариант для решения проблемы?</p>
<hr />
<p><code>AnsiString GetAllTextFromWebPage(TCppWebBrowser *wb)<br />
{<br />
        AnsiString s = wb->OleObject.OlePropertyGet("Document").OlePropertyGet("Body").OlePropertyGet("InnerText");<br />
        return s;<br />
}</code><br />
Сам на днях перерыл много инфы, ни чего толком не нашел, но пришел к такому изяществу, через COM-объект получаешь весь текст на странице<br />
Если нужен HTML код странице, меняешь только значение переменной, кажется так, пробуй:<br />
<code>AnsiString GetHTMLTextFromWebPage(TCppWebBrowser *wb)<br />
{<br />
        AnsiString s = wb->OleObject.OlePropertyGet("Document").OlePropertyGet("Body").OlePropertyGet("InnerHtml");<br />
        return s;<br />
}</code></p>
<hr />
<p>Проблема в том, что в цикле браузер не успевает загрузить содержимое страницы и на этом этапе возникает ошибка доступа. Все решиться если знать как дождаться определенного события = загрузки страницы, и только после этого запускать остальные фунциии цикла, стоит вопрос, как это сделать?</p>
<p>Проблема решается  следущим образом, в теле цикла где происходит обработка страницы пишем сразу после того как браузер получает адрес страницы <a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a>->Navigate2(URL)</p>
<p><code>while (CppWebBrowser->ReadyState != 4)<br />
{<br />
  Application->ProcessMessages();;<br />
}</code></p>
<blockquote><p><strong>Похожая статья:</strong><br />
<a href="http://about-programming.ru/ccc/586.html">Особенности копирования текста страницы в CppWebBrowser на C++ Builder</a></p></blockquote>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/586.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем браузер на С++Builder</title>
		<link>http://about-programming.ru/ccc/582.html</link>
		<comments>http://about-programming.ru/ccc/582.html#comments</comments>
		<pubDate>Sat, 02 Jan 2010 13:56:28 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[CppWebBrowser]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=582</guid>
		<description><![CDATA[Продолжаю тему клонирования программ darkamster&#8217;a на Delphi в С++Builder. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке &#8216;всеми-любимого&#8217; InternetExplorer. Наш зверь сможет ходить по URL, смотреть Html странички, ходить вперед и назад, конечно, перезагружать странички и останавливать загрузку.
Начнем новый проект. Советую сразу определиться с дизайном [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаю тему клонирования программ darkamster&#8217;a на Delphi в <strong>С++Builder</strong>. В этой статье я покажу, как с помощью стандартных компонентов, можно создать свой браузер. Браузер будет на движке &#8216;всеми-любимого&#8217; InternetExplorer. Наш зверь сможет ходить по URL, смотреть Html странички, ходить вперед и назад, конечно, перезагружать странички и останавливать загрузку.<span id="more-582"></span><br />
Начнем новый проект. Советую сразу определиться с дизайном программы, не стоит далеко отходить от принятых стандартов, т.е кнопки навигации вверху, чуть ниже поле для ввода адреса URL, под ними будет располагаться просмотровщик страниц (компонент <strong><a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a></strong>).</p>
<p><img class="aligncenter" title="Пишем браузер" src="http://i-faq.ru/uploads/posts/2007-09/1190994432_builder1.jpg" alt="" width="231" height="144" />Я вместо button использовал компонент panel (это моя задумка &#8211; во время наведения курсора панелька будет подсвечена, как это реализовать я напишу в самом конце). Под навигацией у меня располагается Edit для ввода адреса, под ним компонент <strong><a href="http://about-programming.ru/tag/cppwebbrowser">CppWebBrowser</a></strong>, так же нам понадобиться компонент OpenDialod &#8211; для просмотра страничек с жесткого диска. Итак, впервую очередь мы распишем событие, совершаемое при нажатии enter в edit (с учетом того, что пользователь указал адрес сайта, событие называется &#8211; OnKeyPress). Вот код:</p>
<p><code>if (Key == VK_RETURN){ // нажат ЕНТЕР<br />
wchar_t URL[100];<br />
Edit1-&gt;Text.WideChar(URL,100); //Edit1 принял адрес сайта<br />
<strong>CppWebBrowser</strong>-&gt;Navigate(URL,0,NULL,NULL,NULL); //Адрес направлен на <strong>cppwebbrowser</strong>, пошла загрузка<br />
}</code></p>
<p>Далее напишем код для кнопки открыть:</p>
<p><code>OpenDialog1-&gt;Execute(); //Открываем окно выбора файлов<br />
wchar_t URL[100];<br />
Edit1-&gt;Text=(OpenDialog1-&gt;FileName); //Присваемаем Edit название выбраного файла<br />
Edit1-&gt;Text.WideChar(URL,100);<br />
<strong>CppWebBrowser</strong>-&gt;Navigate(URL,0,NULL,NULL,NULL);</code></p>
<p>Кнопка назад:</p>
<p><code><strong>CppWebBrowser</strong>-&gt;GoBack();</code></p>
<p>Кнопка вперед:</p>
<p><code><strong>CppWebBrowser</strong>-&gt;GoForward();</code></p>
<p>Кнопка стоп:</p>
<p><code><strong>[block]2[/block]</strong>-&gt;Stop();</code></p>
<p>Кнопка Обновить:</p>
<p><code><strong>[block]3[/block]</strong>-&gt;Refresh();</code></p>
<p>Все готово =) Браузер будет спокойно бороздить просторы инета, под вашим чутким контролем. Теперь я распишу то, как менять цвет панелек при наведении. Итак, для начала обговорим, что стандартным цветом наших panel будет &#8211; clBtnFace. Теперь ставим на OnMouseMove, следующий код:</p>
<p><code>Panel1-&gt;Color=clSkyBlue; //я выбрал цвет - небесно синий</code></p>
<p>В результате чего, при наведии панель поменяет цвет, теперь заставим вернуть ее преждний цвет (если пользователь убрал мышь). Сперва, мы должны выбрать событие OnMouseMove для Form1 и теперь пишем код:</p>
<p><code>Panel1-&gt;Color=clBtnFace; //результат панель приняла стандартный цвет</code></p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/582.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ввод/вывод с помощью функции CreateFile</title>
		<link>http://about-programming.ru/ccc/565.html</link>
		<comments>http://about-programming.ru/ccc/565.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:50:21 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[Delphi/Pascal]]></category>
		<category><![CDATA[CreateFile]]></category>
		<category><![CDATA[Win32]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=565</guid>
		<description><![CDATA[ В Win32 файл открывается при помощи функции, имеющей обманчивое название: 
  function CreateFile(IpFileName: PChar; dwDesiredAccess,  
 dwShareMode: DWORD;   IpSecurityAttributes: PSecurityAttributes; 
  dwCreationDistribution, dwFlagsAndAttributes: DWORD;  
 hTemplateFile: THandle): THandle 
 Хоть ее название и начинается с create, но она позволяет не только создавать, но и открывать уже существующие файлы. [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Verdana; font-size: small;"> В <a href="http://about-programming.ru/tag/win32">Win32</a> файл открывается при помощи функции, имеющей обманчивое название: </span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> <strong>function</strong> <strong><a href="http://about-programming.ru/tag/createfile">CreateFile</a></strong>(IpFileName: PChar; dwDesiredAccess, </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">dwShareMode: DWORD;   IpSecurityAttributes: PSecurityAttributes;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> dwCreationDistribution, dwFlagsAndAttributes: DWORD; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">hTemplateFile: THandle): THandle</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Хоть ее название и начинается с<strong> <span style="font-family: Verdana; font-size: x-small;">create</span></strong>, но она позволяет не только создавать, но и открывать уже существующие файлы. </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Такое огромное количество параметров оправдано, т. к. <span style="font-family: Verdana; font-size: x-small;"> createFile</span> используется для открытия файлов на диске, устройств, каналов, портов и вообще любых источников ввода/вывода.<span id="more-565"></span></span></p>
<p><span style="font-family: Verdana; font-size: small;"> Функция <strong><span style="font-family: Verdana; font-size: x-small;"> createFile</span></strong> возвращает дескриптор открытого объекта ввода/вывода. Если открытие невозможно из-за ошибок, возвращается код <span style="font-family: Verdana; font-size: x-small;">INVALID_HANDLE_VALUE</span>, а расширенный код ошибки можно узнать, вызвав функцию<strong> </strong><span style="font-family: Verdana; font-size: x-small;">GetLastError</span>. </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Закрывается файл в <a href="http://about-programming.ru/tag/win32">Win32</a> функцией <strong><span style="font-family: Verdana; font-size: x-small;">closeHandie</span></strong> (не <strong><span style="font-family: Verdana; font-size: x-small;">closeFile</span></strong>, a <strong><span style="font-family: Verdana; font-size: x-small;">closeHandle</span></strong>! Правда, &laquo;легко&raquo; запомнить? Что поделать, так их назвали разработчики Win32). </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Приведем из большого разнообразия несколько приемов использования функции <strong><span style="font-family: Verdana; font-size: x-small;">CreateFile</span></strong>. Часто программисты хотят иметь возможность организовать посекторный доступ к физическим устройствам хранения — например к дискете. Сделать это не так уж сложно, но при этом методы для Windows 98 и Windows 2000 различаются. В Windows 2000 придется открывать устройство (&#8216;\\.\A:&#8217;), а в Windows 98 — специальный драйвер доступа (обозначается &#8216;\\.\vwin32&#8242;). И то и другое делается функцией <strong><span style="font-family: Verdana; font-size: x-small;">createFile</span></strong>.</span></p>
<p style="text-align: center;"><span style="font-family: Verdana; font-size: small;">Чтение    сектора с дискеты при помощи функции CreateFile</span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> type</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> pDIOCRegs  = ^TDIOCRegs;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> TDIOCRegs = packed record</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> rEBX,rEDX,rECX,rEAX,rEDI, rESI, rFlags : DWORD;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> const VWIN32_DIOC_DOS_IOCTL = 1;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> VWIN32_DIOC_DOS_INT13  =  4;        //Прерывание 13</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> SectorSize = 512;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> function ReadSector(Head, Track, Sector: Integer; buffer : pointer; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">Floppy: char):Boolean; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> var hDevice : THandle; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Regs : TDIOCRegs;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> DevName : string; nb : Integer; </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if WIN32PLATFORM &lt;&gt; VER_PLATFORM_WIN32_NT then</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin {win95/98} hDevice := CreateFile(&#8216;\\.\vwin32&#8242;, GENERIC_READ, 0, nil, 0,</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> FILE_FLAG_DELETE_ON_CLOSE, 0);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if (hDevice = INVALID_HANDLE_VALUE) then</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Result := FALSE;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Exit; end;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rEDX := Head * $100 + Ord(Floppy in ['b', 'B']);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rEAX := $201; // KOH onepam-iM read sector</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rEBX := DWORD(buffer); // buffer</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rECX := Track * $100 + Sector;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> regs.rFlags := $0;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Result := DeviceloControl(hDevice,VWIN32_DIOC_DOS_INT13,</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> @regs, sizeof(regs),  @regs, sizeof(regs), nb, nil) </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> and ((regs.rFlags and $1)=0); CloseHandle(hDevice); </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end {win95/98} </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> else</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin // Windows NT/2000 </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> DevName :=&#8217;\\.\A:&#8217;;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if Floppy in ['b', 'B'] then DevName[5] := Floppy;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> hDevice := CreateFile(pChar(Devname), GENERIC_READ,     FILE_SHARE_READ </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if (hDevice = INVALID_HANDLE_VALUE) then </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> Result := FALSE;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">Exit;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">end;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">SetFilePointer(hDevice, (Sector-1)*SectorSize, nil, FILE_BEGIN); // нумерация с 1</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"><span style="font-family: Verdana; font-size: x-small;"> Result := ReadFile(hDevice, buffer&#8217;;, SectorSize, nb, nil) and (nb=SectorSize);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> CloseHandle(hDevice);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end; // Windows NT/2000 </span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">end;</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Для чтения и записи данных в Win32 используются функции: </span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> function ReadFile(hFile: THandle; var Buffer; nNumberOfBytesToRead: DWORD; var IpNumberOfBytesRead: DWORD; IpOverlapped: POverlapped): BOOL; function WriteFile(hFile: THandle; const Buffer; nNumberOfBytesToWrite: DWORD; var IpNumberOfBytesWritten: DWORD; IpOverlapped: POverlapped): BOOL;</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Здесь все сходно с <span style="font-family: Verdana; font-size: x-small;">BlockRead</span> и <span style="font-family: Verdana; font-size: x-small;">Blockwrite: hFile</span> — это дескриптор файла, <span style="font-family: Verdana; font-size: x-small;"> Buffer</span> — адрес, по которому будут читаться (писаться) данные; третий параметр означает требуемое число читаемых (записываемых) байтов, а четвертый — фактически прочитанное (записанное). Последний параметр — <span style="font-family: Verdana; font-size: x-small;"> IpOverlapped</span> — обсудим чуть позже. </span></p>
<p><span style="font-family: Verdana; font-size: small;"> Функция <span style="font-family: Verdana; font-size: x-small;"> createFile</span> используется и для доступа к портам ввода/вывода. Часто программисты сталкиваются с задачей: как организовать обмен данными с различными нестандартными устройствами, подключенными к параллельному или последовательному порту? В Turbo Pascal для DOS был очень хороший псевдомассив <span style="font-family: Verdana; font-size: x-small;"> Ports</span>: пишешь <span style="font-family: Verdana; font-size: x-small;"> Port[x] := у;</span> и не знаешь проблем. В Win32 прямой доступ к портам запрещен и приходится открывать их как файлы: </span></p>
<blockquote><p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;">&#8230;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> hCom := CreateFile(&#8216;COM2&#8242;, GENERIC_READ or GENERIC_WRITE,</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> 0, NIL, OPEN_EXISTING, FILE_FLAG__OVERLAPPED, 0) ;</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> if hCom = INVALID_HANDLE_VALUE then</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> begin</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> raise EAbort.CreateFmt(&#8216;Ошибка открытия порта: %d*,[GetLastError]);</span> </span></p>
<p><span style="font-family: Verdana; font-size: small;"> <span style="font-family: Verdana; font-size: x-small;"> end;</span> </span></p></blockquote>
<p><span style="font-family: Verdana; font-size: small;"> Самое  большое  отличие  от  предыдущего  примера —  в  скромном  флаге <span style="font-family: Verdana; font-size: x-small;">FILE_FLAG_OVERLAPPED</span>.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/565.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Расстановка 8 ферзей на Delphi / Pascal</title>
		<link>http://about-programming.ru/delphipascal/563.html</link>
		<comments>http://about-programming.ru/delphipascal/563.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:43:11 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[Delphi/Pascal]]></category>
		<category><![CDATA[8 ферзей]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=563</guid>
		<description><![CDATA[Программа расставляет на шахматной доске 8 ферзей так, чтобы они не били друг друга.
Расстановка 8 ферзей. Исходный код

Uses CRT;
Const N = 8; // 8 Клеток
      M = 8; // [block]0[/block]
Type Queen = record
           X,Y : Integer;
     [...]]]></description>
			<content:encoded><![CDATA[<p>Программа расставляет на шахматной доске <strong><a href="http://about-programming.ru/tag/8-%d1%84%d0%b5%d1%80%d0%b7%d0%b5%d0%b9">8 ферзей</a></strong> так, чтобы они не били друг друга.</p>
<h3>Расстановка <a href="http://about-programming.ru/tag/8-%d1%84%d0%b5%d1%80%d0%b7%d0%b5%d0%b9">8 ферзей</a>. Исходный код</h3>
<p><code><br />
Uses CRT;</p>
<p>Const N = 8; // 8 Клеток<br />
      M = 8; // [block]0[/block]</p>
<p>Type Queen = record<br />
           X,Y : Integer;<br />
     End;</p>
<p>Var A : Array[1..N, 1..N] Of Integer;<br />
    K : Array[1..M] Of Queen;<br />
    I,J,Q,X,Y : Integer;<br />
</code><span id="more-563"></span><br />
<code><br />
Procedure ClearQueen;<br />
Var I : Integer;<br />
Begin<br />
     For I := 1 To M Do<br />
     Begin<br />
          K[I].X := 0;<br />
          K[I].Y := 0;<br />
     End;<br />
End;</p>
<p>Procedure ShowQueen;<br />
Var I : Integer;<br />
Begin<br />
     For I := 1 To M Do<br />
         WriteLn('Q',I, ' [', K[I].X, ',', K[I].Y, ']');<br />
End;</p>
<p>Procedure SetQueen;<br />
Begin<br />
     For I := 1 To M Do<br />
         If (K[I].X <> 0) And (K[I].Y <> 0) Then<br />
            A[K[I].X, K[I].Y] := I;<br />
End;</p>
<p>Procedure ClearArray;<br />
Var I,J : Integer;<br />
Begin<br />
     For I := 1 To N Do<br />
         For J := 1 To N Do<br />
             A[I, J] := 0;<br />
End;</p>
<p>Procedure ShowArray;<br />
Var I,J : Integer;<br />
Begin<br />
     For I := 1 To N Do<br />
     Begin<br />
         For J := 1 To N Do<br />
             Write(A[I, J]:3);<br />
         WriteLn;<br />
     End;<br />
End;</p>
<p>Procedure SetArray(X,Y : Integer);<br />
Var I,J : Integer;<br />
Begin<br />
     For I := 1 To N Do Inc(A[I,Y]);<br />
     For I := 1 To N Do Inc(A[X,I]);<br />
     For I := -N To N Do<br />
         If (X+I>=1) And (X+I<=N) And (Y+I>=1) And (Y+I<=N) Then<br />
            Inc(A[X+I,Y+I]);<br />
     For I := -N To N Do<br />
         If (X+I>=1) And (X+I<=N) And (Y-I>=1) And (Y-I<=N) Then<br />
            Inc(A[X+I,Y-I]);<br />
End;</p>
<p>Function CountArray:Integer;<br />
Var I,J,S : Integer;<br />
Begin<br />
     S := 0;<br />
     For I := 1 To N Do<br />
         For J := 1 To N Do<br />
             If A[I, J] = 0 Then Inc(S);<br />
     CountArray := S;<br />
End;</p>
<p>Begin<br />
     ClrScr;<br />
     ClearArray;<br />
     ClearQueen;</p>
<p>// =ЦЕЛОЕ((B2-1)/8)+1<br />
// =B2-8*(C2-1)</p>
<p>     Q := 1;<br />
     I := 1;</p>
<p>     While (Q <= M) Do<br />
     Begin<br />
          X := Trunc((I-1)/N)+1;<br />
          Y := I-N*(X-1);<br />
          If A[X,Y] = 0<br />
          Then<br />
            Begin<br />
               SetArray(X,Y);<br />
               K[Q].X := X;<br />
               K[Q].Y := Y;<br />
               Inc(Q);<br />
            End<br />
          Else Inc(I);</p>
<p>          If I > N*N<br />
          Then<br />
            Begin<br />
                 Dec(Q);<br />
                 I := 1+((K[Q].X - 1) * N + K[Q].Y);<br />
                 K[Q].X := 0;<br />
                 K[Q].Y := 0;</p>
<p>                 ClearArray;<br />
                 For J := 1 To Q-1 Do SetArray(K[J].X,K[J].Y);<br />
            End;</p>
<p>     End;</p>
<p>     ClrScr;<br />
     ShowQueen;<br />
     ClearArray;<br />
     SetQueen;<br />
     ShowArray;</p>
<p>End.<br />
</code></p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/delphipascal/563.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Расстановка 8 ферзей на шахматной доске</title>
		<link>http://about-programming.ru/ccc/560.html</link>
		<comments>http://about-programming.ru/ccc/560.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:37:25 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[8 ферзей]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=560</guid>
		<description><![CDATA[Пробовали ли вы когда-нибудь расставить 8 ферзей на шахматной доске так, чтобы ни один из них не находился под ударом? Зная, что ферзь бьет по вертикали, горизонтали и диагонали, довольно непросто подобрать такую позицию. Но не для С. Небольшая программа за считанные минуты выдаст вам около 90 таких позиций, например, вот такую:


int col[8], up_free[15], dn_free[15], [...]]]></description>
			<content:encoded><![CDATA[<p>Пробовали ли вы когда-нибудь расставить <a href="http://about-programming.ru/tag/8-%D1%84%D0%B5%D1%80%D0%B7%D0%B5%D0%B9">8 ферзей</a> на шахматной доске так, чтобы ни один из них не находился под ударом? Зная, что ферзь бьет по вертикали, горизонтали и диагонали, довольно непросто подобрать такую позицию. Но не для С.<span id="more-560"></span> Небольшая программа за считанные минуты выдаст вам около 90 таких позиций, например, вот такую:</p>
<p><img class="aligncenter" title="Расстановка 8 ферзей" src="http://www.codenet.ru/progr/alg/ferzi.gif" alt="" width="205" height="205" /></p>
<p><code><br />
int col[8], up_free[15], dn_free[15], coln[8] ;</code></p>
<p>main( )<br />
{<br />
int i ;</p>
<p>for ( i = 0 ; i &lt;= 7 ; i++ )<br />
col[i] = 1 ;<br />
for ( i = 0 ; i &lt;= 14 ; i++ )<br />
up_free[i] = dn_free[i] = 1 ;<br />
clrscr( ) ;<br />
addqueen( ) ;<br />
}</p>
<p>addqueen( )<br />
{<br />
int i, c, r ;<br />
static int comb, row = -1 ;</p>
<p>row++ ;</p>
<p>/* Проверяем колонки */<br />
for ( i = 0 ; i &lt;= 7 ; i++ )                 {                     /* если клетка не находится под ударом */                     if ( col[i] &amp;&amp; up_free[i+row] &amp;&amp; dn_free[row-i+7])         {             			  /* запоминаем, что в строке находится ферзь */ 	          coln[row] = i ; 	           /* маркируем колонку и диагональ */  	          col[i] = 0 ;              	          up_free[i+row] = 0 ;              	          dn_free[row-i+7] = 0 ; 	           /* если заполнены все строки */             	          if ( row &gt;= 7 )<br />
{<br />
comb++ ;<br />
printf ( &laquo;\n\n\ncombination no. %d&raquo;, comb ) ;<br />
for ( r = 0 ; r &lt;= 7 ; r++ )<br />
{<br />
printf ( &laquo;\n&raquo; ) ;<br />
for ( c = 0 ; c &lt;= 7 ; c++ )<br />
{<br />
if ( c == coln[r] )<br />
printf ( &raquo; Q &raquo; ) ;<br />
else<br />
printf ( &raquo; . &raquo; ) ;<br />
}<br />
}<br />
}<br />
else<br />
addqueen( ) ;</p>
<p>/* снимаем пометку с колонки и диагонали */<br />
col[ coln[row] ] = 1 ;<br />
up_free[ row + coln[row] ] = 1 ;<br />
dn_free[ row - coln[ row ] + 7 ] = 1 ;<br />
}<br />
}<br />
row&#8211; ; /* уменьшаем счетчик строк, пробуем следующую комбинацию */<br />
}</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/560.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Комплексные числа в Delphi 7</title>
		<link>http://about-programming.ru/delphipascal/527.html</link>
		<comments>http://about-programming.ru/delphipascal/527.html#comments</comments>
		<pubDate>Tue, 29 Dec 2009 17:32:02 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[Delphi/Pascal]]></category>
		<category><![CDATA[Комплексные числа]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=527</guid>
		<description><![CDATA[Комплексные числа в Delphi 7 имеют два представления: rectanglar: Z = a + i * b, a является действительной частью, и b мнимой частью: Z = r * exp(i * phi), r является абсолютной ценностью, и phi является аргументом (угол). Вот это подразделение, которое приближается к сложным, как запись. Использовать запись двойного назначения, либо прямоугольные [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Комплексные числа в Delphi 7</strong> имеют два представления: rectanglar: Z = a + i * b, a является действительной частью, и b мнимой частью: Z = r * exp(i * phi), r является абсолютной ценностью, и phi является аргументом (угол). Вот это подразделение, которое приближается к сложным, как запись. Использовать запись двойного назначения, либо прямоугольные или полярные.<span id="more-527"></span><br />
<H3>Комплексные числа в Delphi 7. Код программы</H3><br />
<code><em>{ </em>единицы для комплексных чисел основан на C_reords<br />
<em>-----------------------------------------</em> они являются эффективными с массивами<br />
<em>}</em><br />
<strong>unit</strong> ComplexRec;</code></p>
<p><strong>interface</strong></p>
<p><strong>type</strong><br />
float = extended;</p>
<p>ComplexPtr = ^Complex;<br />
Complex = <strong>record</strong><br />
a, b: float;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_Copy(a: ComplexPtr): ComplexPtr; <em>// result:=a</em></p>
<p><strong>function</strong> C_One: ComplexPtr; <em>// result:=1 </em><em>Оба</em><br />
<strong>function</strong> C_I: ComplexPtr; <em>// result:=i </em><em>Прямоугольные</em><br />
<strong>function</strong> C_IP: ComplexPtr; <em>// result:=i </em><em>Поляризованные</em><br />
<strong>procedure</strong> C_P2R(a: ComplexPtr); <em>// </em><em>поляризованный</em><em> в</em><em> прямоугольный</em><br />
<strong>procedure</strong> C_R2P(a: ComplexPtr); <em>// </em><em>прямоугольный</em><em> </em> в <em>поляризованный</em><em> </em><br />
<strong>function</strong> C_abs(a: ComplexPtr): float; <em>// </em><em>Прямоугольные</em><br />
<strong>function</strong> C_arg(a: ComplexPtr): float; <em>// </em><em>Прямоугольные</em><br />
<strong>function</strong> C_re(a: ComplexPtr): float; <em>// </em><em>Поляризованные</em><br />
<strong>function</strong> C_im(a: ComplexPtr): float; <em>// </em><em>Поляризованные</em><br />
<strong>procedure</strong> C_Inv(a: ComplexPtr); <em>// a:=-a </em><em>Прямоугольные</em><br />
<strong>procedure</strong> C_InvP(a: ComplexPtr); <em>// a:=-a </em><em>Поляризованные</em><br />
<strong>procedure</strong> C_Conj(a: ComplexPtr); <em>// a:=konjug(a) </em><em>Оба</em><br />
<strong>function</strong> C_ConjN(a: ComplexPtr): ComplexPtr; <em>//result:=konjug(a) </em><em>Оба</em><br />
<strong>procedure</strong> C_Scale(a: ComplexPtr; u: float); <em>// a:=a*u;</em><br />
<strong>procedure</strong> C_ScaleP(a: ComplexPtr; u: float); <em>// a:=a*u;</em></p>
<p><strong>procedure</strong> C_Add(a, b: ComplexPtr); <em>//a:=a+b </em><em>Прямоугольный</em><em> </em><br />
<strong>function</strong> C_AddN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a+b </em><em>Прямоугольный</em><em> </em><br />
<strong>procedure</strong> C_Sub(a, b: ComplexPtr); <em>//a:=a-b </em><em>Прямоугольный</em><em> </em><br />
<strong>function</strong> C_SubN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a-b </em><em>Прямоугольный</em><em> </em><br />
<strong>procedure</strong> C_Mul(a, b: ComplexPtr); <em>//a:=a*b </em><em>Прямоугольный</em><em></em><br />
<strong>function</strong> C_MulN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b </em><em>Прямоугольный</em><em></em><br />
<strong>procedure</strong> C_MulP(a, b: ComplexPtr); <em>//a:=a*b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_MulNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b </em><em>Поляризованный</em><em></em><br />
<strong>procedure</strong> C_DivP(a, b: ComplexPtr); <em>//a:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_DivNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>procedure</strong> C_Div(a, b: ComplexPtr); <em>//a:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_DivN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_ExpN(a: ComplexPtr): ComplexPtr; <em>// </em><em>Прямоугольный</em><em></em><br />
<strong>function</strong> C_LogN(a: ComplexPtr): ComplexPtr; <em>// </em><em>Поляризованный</em><em></em><br />
<strong>function</strong> C_SinN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_CosN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_TanN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_SinhN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_CoshN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_TanhN(a: ComplexPtr): ComplexPtr;<br />
<strong>function</strong> C_IntPowerN(a: ComplexPtr; n: integer): ComplexPtr; <em>// </em><em>Прямоугольный</em><em></em><br />
<strong>function</strong> C_IntPowerNP(a: ComplexPtr; n: integer): ComplexPtr; <em>// </em><em>Поляризованный</em><em></em></p>
<p><strong>function</strong> C_ParallelN(a, b: ComplexPtr): ComplexPtr;<br />
<em>// result:=a//b =(a*b)/(a+b) </em><em>Прямоугольный</em><em></em></p>
<p><em></em></p>
<p><strong>implementation</strong></p>
<p><strong>uses</strong> math;</p>
<p><strong>const</strong><br />
AlmostZero = 1E-30;</p>
<p><strong>function</strong> C_Copy(a: ComplexPtr): ComplexPtr; <em>// result:=a</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a;<br />
result.b := a.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_One: ComplexPtr; <em>// result:=1</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := 1;<br />
result.b := 0;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_I: ComplexPtr; <em>// result:=i </em><em>Прямоугольный</em><em></em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := 0;<br />
result.b := 1;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_IP: ComplexPtr; <em>// result:=i </em><em>Поляризованный</em><em></em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := 1;<br />
result.b := pi / 2;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_P2R(a: ComplexPtr);<br />
<strong>var</strong><br />
t, u, v: float;<br />
<strong>begin</strong><br />
t := a.a;<br />
sincos(a.b, u, v);<br />
a.a := t * v;<br />
a.b := t * u;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_R2P(a: ComplexPtr);<br />
<strong>var</strong><br />
t: float;<br />
<strong>begin</strong><br />
t := a.a;<br />
a.a := sqrt(sqr(a.a) + sqr(a.b));<br />
<strong>if</strong> (abs(t)0 <strong>then</strong> a.b := pi / 2<br />
<strong>else</strong><br />
a.b := -pi / 2;<br />
<strong>end</strong><br />
<strong>else</strong><br />
<strong>begin</strong><br />
a.b := arctan(a.b / t);<br />
<strong>if</strong> (t &lt; 0) <strong>then</strong><br />
a.b := a.b + pi;<br />
<strong>end</strong>;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_abs(a: ComplexPtr): float;<br />
<strong>begin</strong><br />
result := sqrt(sqr(a.a) + sqr(a.b));<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_arg(a: ComplexPtr): float;<br />
<strong>begin</strong><br />
<strong>if</strong> (abs(a.a)0 <strong>then</strong> result := pi / 2<br />
<strong>else</strong><br />
result := -pi / 2;<br />
<strong>end</strong><br />
<strong>else</strong><br />
<strong>begin</strong><br />
result := arctan(a.b / a.a);<br />
<strong>if</strong> (a.a &lt; 0) <strong>then</strong><br />
result := result + pi;<br />
<strong>end</strong>;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_re(a: ComplexPtr): float; <em>// ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := a.a * cos(a.b);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_im(a: ComplexPtr): float; <em>// ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := a.a * sin(a.b);<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Inv(a: ComplexPtr); <em>// a:=-a </em><em>Прямоугольный</em><em></em><br />
<strong>begin</strong><br />
a.a := -a.a;<br />
a.b := -a.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_InvP(a: ComplexPtr); <em>// a:=-a ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
a.b := a.b + pi;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Conj(a: ComplexPtr); <em>// a:=konjug(a) </em><em>Оба</em><br />
<strong>begin</strong><br />
a.b := -a.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_ConjN(a: ComplexPtr): ComplexPtr; <em>//result:=konjug(a) </em><em>Оба</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a;<br />
result.b := -a.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Scale(a: ComplexPtr; u: float); <em>// a:=a*u;</em><br />
<strong>begin</strong><br />
a.a := a.a * u;<br />
a.b := a.b * u;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_ScaleP(a: ComplexPtr; u: float); <em>// a:=a*u;</em><br />
<strong>begin</strong><br />
a.a := a.a * u;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Add(a, b: ComplexPtr); <em>//a:=a+b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a + b.a;<br />
a.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_AddN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a+b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a + b.a;<br />
result.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Sub(a, b: ComplexPtr); <em>//a:=a-b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a &#8211; b.a;<br />
a.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_SubN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a-b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a &#8211; b.a;<br />
result.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Mul(a, b: ComplexPtr); <em>//a:=a*b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>var</strong><br />
u, v: float;<br />
<strong>begin</strong><br />
u := a.a * b.a &#8211; a.b * b.b;<br />
v := a.a * b.b + a.b * b.a;<br />
a.a := u;<br />
a.b := v;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_MulN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a * b.a &#8211; a.b * b.b;<br />
result.b := a.a * b.b + a.b * b.a;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_MulP(a, b: ComplexPtr); <em>//a:=a*b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a * b.a;<br />
a.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_MulNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a*b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a * b.a;<br />
result.b := a.b + b.b;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_Div(a, b: ComplexPtr); <em>//a:=a/b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>var</strong><br />
t: float;<br />
<strong>begin</strong><br />
t := a.a / b.a + a.b / b.b;<br />
a.b := -a.a / b.b + a.b / b.a;<br />
a.a := t;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_DivN(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b ПРЯМОУГОЛЬНЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a / b.a + a.b / b.b;<br />
result.b := -a.a / b.b + a.b / b.a;<br />
<strong>end</strong>;</p>
<p><strong>procedure</strong> C_DivP(a, b: ComplexPtr); <em>//a:=a/b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
a.a := a.a / b.a;<br />
a.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_DivNP(a, b: ComplexPtr): ComplexPtr; <em>//result:=a/b ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := a.a / b.a;<br />
result.b := a.b &#8211; b.b;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_ExpN(a: ComplexPtr): ComplexPtr; <em>// RECTANGLE</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := exp(a.a);<br />
result.b := a.b;<br />
C_P2R(result);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_LogN(a: ComplexPtr): ComplexPtr; <em>// ПОЛЯРИЗОВАННЫЙ</em><br />
<strong>begin</strong><br />
result := new(ComplexPtr);<br />
result.a := ln(a.a);<br />
result.b := a.b;<br />
C_R2P(result);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_SinN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
z, n, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
t := C_I;<br />
v := C_MulN(a, t); <em>// i*a</em><br />
z := C_expN(a); <em>// exp(i*a)</em><br />
t := C_Copy(v);<br />
C_Inv(t); <em>// -i*a</em><br />
t := C_ExpN(v); <em>// exp(-i*a)</em><br />
C_Sub(z, t);<br />
n := C_I;<br />
C_Scale(n, 2);<br />
result := C_DivN(z, n);<br />
dispose(z);<br />
dispose(n);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_CosN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
z, n, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
t := C_I;<br />
v := C_MulN(a, t); <em>// i*a</em><br />
z := C_expN(a); <em>// exp(i*a)</em><br />
t := C_Copy(v);<br />
C_Inv(t); <em>// -i*a</em><br />
t := C_ExpN(v); <em>// exp(-i*a)</em><br />
C_Add(z, t);<br />
n := C_One;<br />
C_Scale(n, 2);<br />
result := C_DivN(z, n);<br />
dispose(z);<br />
dispose(n);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_TanN(a: ComplexPtr): ComplexPtr;<br />
<strong>begin</strong></p>
<p><strong>end</strong>;</p>
<p><strong>function</strong> C_SinhN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
u, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
u := C_ExpN(a);<br />
t := C_Copy(a);<br />
C_inv(t);<br />
v := C_ExpN(t);<br />
result := C_SubN(u, v);<br />
C_Scale(result, 1 / 2);<br />
dispose(u);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_CoshN(a: ComplexPtr): ComplexPtr;<br />
<strong>var</strong><br />
u, v, t: ComplexPtr;<br />
<strong>begin</strong><br />
u := C_ExpN(a);<br />
t := C_Copy(a);<br />
C_inv(t);<br />
v := C_ExpN(t);<br />
result := C_AddN(u, v);<br />
C_Scale(result, 1 / 2);<br />
dispose(u);<br />
dispose(v);<br />
dispose(t);<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_TanhN(a: ComplexPtr): ComplexPtr;<br />
<strong>begin</strong></p>
<p><strong>end</strong>;</p>
<p><strong>function</strong> C_IntPowerN(a: ComplexPtr; n: integer): ComplexPtr;<br />
<strong>var</strong><br />
j: integer;<br />
u, v: float;<br />
<strong>begin</strong><br />
<strong>if</strong> n = 0 <strong>then</strong><br />
result := C_One<br />
<strong>else</strong><br />
<strong>begin</strong><br />
result := C_Copy(a);<br />
<strong>if</strong> n &gt; 1 <strong>then</strong><br />
<strong>begin</strong><br />
C_R2P(result);<br />
u := result.a;<br />
v := result.b;<br />
<strong>for</strong> j := 2 <strong>to</strong> n <strong>do</strong><br />
<strong>begin</strong><br />
u := u * result.a;<br />
v := v + result.b;<br />
<strong>end</strong>;<br />
result.a := u;<br />
result.b := v;<br />
C_P2R(result);<br />
<strong>end</strong>;<br />
<strong>if</strong> n &lt; 0 <strong>then</strong><br />
<strong>begin</strong></p>
<p><strong>end</strong>;<br />
<strong>end</strong>;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_IntPowerNP(a: ComplexPtr; n: integer): ComplexPtr;<br />
<strong>var</strong><br />
j: integer;<br />
u, v: float;<br />
<strong>begin</strong><br />
result := C_Copy(a);<br />
u := result.a;<br />
v := result.b;<br />
<strong>for</strong> j := 2 <strong>to</strong> n <strong>do</strong><br />
<strong>begin</strong><br />
u := u * result.a;<br />
v := v + result.b;<br />
<strong>end</strong>;<br />
result.a := u;<br />
result.b := v;<br />
<strong>end</strong>;</p>
<p><strong>function</strong> C_ParallelN(a, b: ComplexPtr): ComplexPtr;<br />
<em>// result:=a//b = (a*b)/(a+b)</em><br />
<strong>var</strong><br />
z, n: ComplexPtr;<br />
<strong>begin</strong><br />
z := C_MulN(a, b);<br />
n := C_AddN(a, b);<br />
C_R2P(n);<br />
C_R2P(z);<br />
result := C_DivNP(z, n);<br />
C_P2R(result);<br />
dispose(n);<br />
dispose(z);<br />
<strong>end</strong>;</p>
<p><strong>end</strong>.</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/delphipascal/527.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чтение/запись блоков данных на C# (C Sharp)</title>
		<link>http://about-programming.ru/ccc/491.html</link>
		<comments>http://about-programming.ru/ccc/491.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 19:01:01 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[C/C++/C#]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=491</guid>
		<description><![CDATA[Чтение/запись блоков данных на C# (C Sharp)



В этой статье речь пойдет о чтении/записи данных в файл, буфер или в память при помощи трех классов, образованых от абстрактного класс System.IO.Stream. Мы рассмотрим классы FileStream, MemoryStream, BufferedStream.
Классы, производные от Stream(поток), предназначенны для работы с двоичными данными и могут искать какую-то часть данных в потоке. Сам по себе, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Чтение/запись блоков данных на C# (C Sharp)</strong></p>
<div>
<div>
<div>
<p>В этой статье речь пойдет о <strong>чтении/записи данных</strong> в файл, буфер или в память при помощи трех классов, образованых от абстрактного класс System.IO.Stream. Мы рассмотрим классы FileStream, MemoryStream, BufferedStream.</p>
<p>Классы, производные от Stream(поток), предназначенны для работы с двоичными данными и могут искать какую-то часть данных в потоке. Сам по себе, базовый класс уже имеет некоторые методы и свойства, который унаследованы в следующих классах. Вот список и предназначение этих методов и свойств.<span id="more-491"></span></p>
<table border="1" cellspacing="0" cellpadding="0" width="89%" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="16%"><strong>CanRead</strong></td>
<td width="84%">Определяет, будет ли данный поток поддерживать чтение</td>
</tr>
<tr>
<td><strong>CanSeek</strong></td>
<td>Определяет, будет ли данный поток поддерживать поиск</td>
</tr>
<tr>
<td><strong>CanWrite</strong></td>
<td>И соответственно, будет ли поток поддерживать запись</td>
</tr>
<tr>
<td><strong>Close()</strong></td>
<td>Закрывает текущий поток и освобождает ресурсы</td>
</tr>
<tr>
<td><strong>Flush()</strong></td>
<td>Записывает все данные из буфера в соответствующий источник данных. Освобождает буфер</td>
</tr>
<tr>
<td><strong>Length</strong></td>
<td>Возвращает длину потока в байтах</td>
</tr>
<tr>
<td><strong>Position</strong></td>
<td>Определяет указатель на позицию в потоке</td>
</tr>
<tr>
<td><strong>Read()</strong></td>
<td>Читает последовательность байт</td>
</tr>
<tr>
<td><strong>ReadByte()</strong></td>
<td>Читает один байт</td>
</tr>
<tr>
<td><strong>Seek()</strong></td>
<td>Устанавливает указатель на местонахождение в текущем потоке</td>
</tr>
<tr>
<td><strong>SetLendth()</strong></td>
<td>Устанавливает длину текущего потока</td>
</tr>
<tr>
<td><strong>Write()</strong></td>
<td>Записывает последовательность байт</td>
</tr>
<tr>
<td><strong>WriteByte()</strong></td>
<td>Записывает один байт</td>
</tr>
</tbody>
</table>
<p>Перейдем к первому классу, унаследовавшему эти элементы<br />
Класс FileStream</p>
<p>Этот класс предназначен для работы с файлами(их создание, чтение, запись). Вот пример его использования:</p>
<p>FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read);</p>
<p>Здесь переменная filename указывает на имя файла, а остальные параметры указывают на ограничения и допустимые действия над ним. Рассмотрим их поподробнее.</p>
<p>Перечесление FileMode:</p>
<table border="1" cellspacing="0" cellpadding="0" width="548" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="175" valign="TOP"><strong>FileMode.Append</strong></td>
<td width="373">Открыть файл(переданный первым параметром) и установить указатель на конец файла(то есть для дописываения в него данных. Можно использовать только с <strong>FileAccess.Write</strong>, иначе будет сгенерировано исключение <strong>System.ArgumentException</strong>. Если файл отсутствует, то он создается автоматически и открывается для записи.</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.Create</strong></td>
<td>Создать новый файл. Если файл уже существует, то перезаписать его.</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.CreateNew</strong></td>
<td>Отличается от предыдущего тем, что если файл уже существует, то будет сгенерировано исключение</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.Open</strong></td>
<td>Открыть файл и установить указатель на начало. Если файл не существует, будет сгенерировано исключение <strong>System.IO.FileNotFoundException</strong></td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.OpenOrCreate</strong></td>
<td>Отличается от предыдущего тем, что при отсутствии файла, его создает.</td>
</tr>
<tr>
<td valign="TOP"><strong>FileMode.Truncate</strong></td>
<td>Открывает существующий файл и обрезает его длину до 0 байт. Попытка прочитать файл с указанием такого перечисления приведет к исключению</td>
</tr>
</tbody>
</table>
<p>Перечисление FileAccess:</p>
<table style="height: 68px;" border="1" cellspacing="0" cellpadding="0" width="548" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="181"><strong>FileAccess.Read</strong></td>
<td width="323">Файл открывается исключительно для чтения</td>
</tr>
<tr>
<td><strong>FileAccess.Write</strong></td>
<td>Файл открывается исключительно для записи</td>
</tr>
<tr>
<td><strong>FileAccess.ReadWrite</strong></td>
<td>Это комбо-вариант двух предыдущих</td>
</tr>
</tbody>
</table>
<p>Есть также перечисление FileShare, но оно для нас сейчас не является столь важным. Оно нужно для синхронизации записи или чтения с другими потоками.</p>
<p>Вот код, демонстрирующий простую запись в файл и чтение из него в консоль</p>
<p>FileStream stream = new FileStream(&laquo;test.dat&raquo;, FileMode.OpenOrCreate, FileAccess.ReadWrite);<br />
for(int i = 0: i &lt; 256; i++)<br />
{<br />
myFStream.WriteByte((byte)i);<br />
}<br />
<span style="color: #999999;">// Переставляем внутренний указатель на начало</span><br />
myFStream.Position = 0;<br />
<span style="color: #999999;">// Считываем байты из файла *.dat</span><br />
for(int i = 0; i &lt; 256; i++)<br />
(<br />
Console.Write(myFStream.ReadByte());<br />
}<br />
myFStream.Close();</p>
<h3>Класс MemoryStream</h3>
<p>Этот класс не особо отличается от предыдущего, нами рассмотренного, за исключением того, что он работает(записывает и читает) не с файлом, а с оперативной памятью. Ниже перечисленны наиболее важные его члены:</p>
<table style="height: 124px;" border="1" cellspacing="0" cellpadding="0" width="540" bgcolor="#000" bordercolor="#ffffff">
<tbody>
<tr>
<td width="116" valign="TOP"><strong>Capacity</strong></td>
<td width="609">Это свойство позволяет получить или установить кол-во байтов выделенных под этот поток</td>
</tr>
<tr>
<td valign="TOP"><strong>GetBuffer()</strong></td>
<td>Возвращает массив байтов при помощи которых был создан поток</td>
</tr>
<tr>
<td valign="TOP"><strong>ToArray()</strong></td>
<td>Записывает все содержимое потока в массив байтов не зависимо от свойства Position</td>
</tr>
<tr>
<td valign="TOP"><strong>WriteTo()</strong></td>
<td>Записывает все содержимое объекта(MemoryStream) в другой обьект класса, производного от Stream(например в FileStream)</td>
</tr>
</tbody>
</table>
<p>Вот пример кода осуществляющего запись в файл из MemoryStream через FileStream:</p>
<p>FileStream dumpFile = new FIleStream(&laquo;Dump.dat&raquo;, FleMode.Create, FileAccess.ReadWrlte);<br />
myMemStream.WriteTo(dumpFile);</p>
<p>myMemStream есть объект класса MemoryStream.</p>
<h3>Класс BufferedStream</h3>
<p>И завершает нашу тройку класс BufferedStream. Этот класс нужен для организации временного хранилища данных, чтобы потом передать их в постоянное хранилище. Казалось бы, для чего это нужно, разве не проще просто записать некоторые данные через FileStream.Write()? Конечно можно, но если нам нужна производительность, то лучше использовать буфер, так как при многократном вызове FileStream.Write() нам приходиться много раз обращаться к диску, что существенно замедляет работу нащей программы.<br />
Вот пример использования BufferedStream</p>
<p><span style="color: #999999;">// Создаем объект BufferedStream. подключенный к уже имеющемуся объекту FileStream</span><br />
BufferedStream rnyFileBuffer = new BufferedStream(dumpFile);<br />
<span style="color: #999999;">// Добавляем в BufferedStream несколько байтов</span><br />
<span style="color: #0000ff;"> byte</span>[] str = {127, 0&#215;77, 0&#215;4, 0&#215;0, 0&#215;0, 0&#215;16};<br />
myFileBuffer.Write(str, 0, str.Length);<br />
<span style="color: #999999;">// А теперь записываем все содержимое BufferedStream в файл</span><br />
myFlleBuffer.Close();</p>
<p>Ну вот впринципе и все что. Успехов вам в программировании.</p>
<p><strong>Автор:</strong> CODER</p>
</div>
</div>
</div>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru/category/ccc.html">программирование C++</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/ccc/491.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP аутентификация, установка защиты на страницу используя MySQL и PHP</title>
		<link>http://about-programming.ru/php/487.html</link>
		<comments>http://about-programming.ru/php/487.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 17:00:10 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование на PHP]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=487</guid>
		<description><![CDATA[HTTP аутентификация
Вступление
Это &#8211; обучающая программа которая должна вам показать основы защиты ваших страниц в сети, использующие HTTP аутентификацию. Вместо традиционного .htaccess метода (Apache сервер), мы собираемся использовать для хранения данных о пользователях и их пароли в MySQL. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать MySQL и PHP. В [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://about-programming.ru/php/487.html">HTTP аутентификация</a></strong><br />
<strong>Вступление</strong></p>
<p>Это &#8211; обучающая программа которая должна вам показать основы защиты ваших страниц в сети, использующие <strong>HTTP</strong> аутентификацию. Вместо традиционного .<strong>htaccess</strong> метода (<strong>Apache сервер</strong>), мы собираемся использовать для хранения данных о пользователях и их пароли в <strong><a href="http://about-programming.ru/tag/mysql">MySQL</a></strong>. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать <strong><a href="http://about-programming.ru/tag/mysql">MySQL</a></strong> и <strong><a href="http://about-programming.ru/tag/php">PHP</a></strong>. В принципе на основе этой программы вы можете использовать любой DBMS (система управления базы данных). Почему интересен этот метод? Ну например хотя бы потому что, если Вы используете базу данных, вы можете с легкостью разрешить, только определенной группе (человеку) иметь определенные права для доступа к той или иной информации. Если Вы используете традиционный .<strong>htaccess</strong> метод <strong>Apache</strong>, Вы должны вручную добавлять пользователей и пароль в файле пароля. А преимущество данного метода, ну&#8230;.взгляните сами.<span id="more-487"></span><br />
Программное обеспечение которое необходио:</p>
<p>· *nix платформа (Linux, Unix, *BSD) · <strong>PHP</strong> 3.0.x или <strong>PHP</strong> 4.x · MySQL (любая версия)<br />
<strong>Шаг номер один </strong></p>
<p>- Вперед, первое что надо это выяснить что мы хотим позволить пользователям, которые находится в нашей базе данных, чтобы получить доступ к указанной странице? И как мы собираемся это сделать? ( многим не очень нравится, но надо привыкать перед программированием брать бумажку и записывать все требования, которые мы хотим получить от проги, в перспективе вы сэкономите часы а может дни, для внесения изменений в код (прим.))</p>
<ol>
<li>Проверить, заверен ли пользователь уже.</li>
<li>Если нет, отправить сообшение в броузер, с сообщением и формой для доступа.</li>
<li>Если пользователь княпает на кнопку отмены, не позволить ему доступ и переадресовывать его идти на&#8230; 403: Доступ отвергнут, или показать (кукиш J ) простое сообщение.</li>
<li>Если пользователь заполнил username и комбинацию пароля, проверьте их в <strong>MySQL</strong> базе данных и удостоверятся, что они верны, при положительном исходе разрешить доступ.</li>
</ol>
<p>Если Вы не поняли все не волнуйтесь, станет ясно позже (а может никогда)!</p>
<p><strong>Шаг Два &#8211; Создаем Нашу Базу данных </strong></p>
<p>Мы хотим, чтобы база данных хранила имена (login) и пароль наших пользователей. Требуемые поля могут легко быть добавлены к существующей базе данных, но мы предположим пока, что Вы не добавляете к уже имеющейся базе а создаете новую. Следующий код это описание того как это сделать. Предположение если у вас на компе стоит Апач совсем что надо, можете немедленно приступить : )</p>
<p><code>mysql&gt; create database members;<br />
mysql&gt; create table users (<br />
username varchar(25) NOT NULL,<br />
password varchar(15) NOT NULL,<br />
primary key (username),<br />
unique username (username)<br />
);</code></p>
<p>Мы теперь имеем базу данных, чтобы хранить в ней пользователей, она предполагает, что username до 25 знаков, и пароли до 15 знаков. (если вам по каким-то причинам не подходит, установите как посчитаете Нужным) Username должен иметь значение &laquo;первичный ключ&raquo; и быть &laquo;уникальным&raquo;, так как мы не хотим чтоб 2 или больше людей имели одинаковый username.<br />
Пожалуйста обратите внимание, что usernames будет чувствитен к следующему случаю, пользователь &#8216;Vasya&#8217; будет идентифицирован другим, нежели пользователь &#8216;vasya&#8217;, проще говоря чувствителен к регистру. Теперь мы добавим в <strong>MySQL</strong> тестового пользователя, чтобы использовать его дянные для тестов, когда мы создадим <strong>PHP страницу</strong>.</p>
<p><code>mysql&gt; grant select on members.users<br />
to httpuser@localhost<br />
identified by 'MyPassword';</code></p>
<p>Это для того чтоб, когда мы хотим проверить пользователя и пароль, человека зарегистрировавшегося в нашей базе данных, мы будем использовать пользователя &laquo;httpuser&raquo; с паролем &laquo;MyPassword&raquo;. Наконец мы должны добавить логин и пароль человека, которому мы хотим позволить доступу .</p>
<p><code>mysql&gt; insert into users value('john_doe', 'eod_nhoj');</code></p>
<p>Я сознательно в проге не шифровал данные, для того, чтоб в случае утери пароля не дешифровать его, и упростить до минимума получения оного : )) Все, с MySQLпокончено теперь идем дальше!</p>
<p><strong>Шаг Три &#8211; пишем PHP код. </strong></p>
<p>Прежде, чем мы начинаем, я опишу вкратце то, что будет делать пага. Когда Вы попадете на защищенную страницу то сервер пошлет запрос и выведет страницу для введения имени и пароля. Если вы нажмете на кнопку отмены или введете не правильные данные то сервер отправит вам ( 401 Неправомочный удар головой, и будет отрицать доступ. ) &#8211; так переводит промпт обычно строку (401 Unauthorized header, and deny access) не буду пояснять по моему лучше не скажешь!!! При случае если вы все введете как надо, то окажется что просто напросто вы получите доступ (то что и требовалось доказать) Теперь самое веселое, это и есть тот самый код. Он написан сознательно с номерами строк, после кода (внизу) даны пояснения к строкам.</p>
<p><code>---<br />
01 &lt;?php<br />
02<br />
03 function access_denied() {<br />
04 echo "401 Unauthorized: The username / password combination you entered was invalid.n";<br />
05 }<br />
06<br />
07 function auth_headers($title) {<br />
08 Header("WWW-Authenticate: Basic realm="$title"");<br />
09 Header("HTTP/1.0 401 Unauthorized");<br />
10 }<br />
11<br />
12 if(!isset($PHP_AUTH_USER)) {<br />
13 auth_headers("My Protected Web Page");<br />
14 access_denied();<br />
15 exit;<br />
16 }<br />
17 else {<br />
18<br />
19 $hostname = "localhost";<br />
20 $username = "httpuser";<br />
21 $password = "MyPassword";<br />
22 $database = "members";<br />
23<br />
24 $query = "select username,password from users where username='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'";<br />
25 $link = mysql_connect($localhost, $username, $password) or die("Unable to connect to database server");<br />
26<br />
27 if (mysql_num_rows(mysql_db_query($database, $query)) == 0) {<br />
28 auth_headers("My Protected Web Page");<br />
29 access_denied();<br />
30 exit;<br />
31 }<br />
32<br />
33 mysql_close($link);<br />
34 }<br />
35 ?&gt;</code></p>
<p>Вот и весь фокус &#8211; покус, работает проверенно можете использовать, где хотите когда хотите и как хотите, меняйте, улучшаете, если вам удасться сократить код до двух строк при сохранении функциональных возможностей проги, то обязательно пришлите его мне!!!</p>
<p>В этой секции мы быстро исследуем каждую линию, чтоб предупредить зарание пылкий обмен вопросами в коментариях к данной статейке.</p>
<p><strong>Строка 3:</strong><br />
Эта функция покажет сообщение, если &laquo;злой юзер&raquo; упорно будет вводить левые данные. Я сделал это функцией, потому что используем ее дважды, и просто чтоб сократить исходный код.<br />
<strong>Строка 7: </strong><br />
Так как мы используем этот заголовок тоже дважды я также сделал это функцией.<br />
<strong>Строка 8: </strong><br />
Передать броузеру заголовок, который заставит таки юзера ввести логин и пароль. Переменная $title будет показана в login диалоге.<br />
<strong>Строка 9: </strong><br />
При первом запросе выводится заголовок при повторной отмене выводит сообщение о запрете доступа.<br />
Строка 12:<br />
$PHP_AUTH_USER цикл который выводит сообщение о том что мол пага защищена, и убирайся вон!<br />
<strong>Строка 19-23: </strong><br />
Это то что кроме вас никто не знает, то есть средства для коннекта с базой данных, имя хоста, имы базы, имя юзера, и пароль. (для соеденения с <strong>MySQL</strong>)<br />
<strong>Строка 24: </strong><br />
Запрос к MySQL который возвращает имена и пароли.<br />
<strong>Строка 25: </strong><br />
Установить связь с <strong>MySQL</strong> и вывести ругательство если связи не будет!!! (это значит что у вас что-то не то в строках 19-23, или вообще нет <strong>MySQL</strong>)<br />
<strong>Строка 27: </strong><br />
Обработать $query. Если возвращет &#8211; 0, это означает, что была введена недействительная комбинация.<br />
<strong>Строка 33: </strong><br />
Разъединить соеденение с <strong>MySQL</strong>.</p>
<p>Я рекомендовал бы сохранить <strong>PHP код</strong> в файле под наванием user_auth.php, user_auth.php3, или&#8230; (тут ваша фантазия на эту тему) Предположим, что таки сохранили этот код в файле user_auth.php. Всякий раз, когда мы захотим вдруг защитить нашу сверхсекретную пагу в сети, мы просто подключаем этот файл. Единственное на что хочется обратить внимание, что по логике надо подключать в самой верхней части своей защищенной <strong>PHP страницы</strong>, советую в строке номер 1 ваше паги написать следующее:</p>
<p><code>&lt;?php require("user_auth.php"); ?&gt;</code></p>
<p>где &laquo;user_auth.php&raquo; это имя файла под которым вы сохранили код.</p>
<p><strong>Ваш вопрос &#8211; я не использую MySQL, как быть? </strong><br />
Посоветуйтесь с админом вашего сервера, если он окажется добрым, то он вам поможет, для него это 5 минут работы, если злой то не поможет, тогда идите на форум относящийся к той БД которую вы исьпользуете и кричите о помощи! Или если вы считаете себя нормальным программером, то&#8230;вам вообще этот код не понадобиться, и вы будите создавать &laquo;сессии&raquo;, шифровать с помощью PGP вобщем извращаться так, как быдто вы делаете защиту для amazon.com</p>
<p>Удачи! : )</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/php/487.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с файлами при помощи PHP</title>
		<link>http://about-programming.ru/php/469.html</link>
		<comments>http://about-programming.ru/php/469.html#comments</comments>
		<pubDate>Fri, 18 Dec 2009 18:50:50 +0000</pubDate>
		<dc:creator>evteev</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование на PHP]]></category>

		<guid isPermaLink="false">http://about-programming.ru/?p=469</guid>
		<description><![CDATA[В настоящее время существует огромное количество средств для создания по  истине интерактивных веб приложений. Среди наиболее популярных стоит отметить  ASP, Perl и PHP. Эти средства прочно вошли в жизнь веб-разработчика. На данный  момент самым быстро развивающимся является язык PHP. Поэтому рассмотрим его  возможности более подробно.
PHP является внедряемым языком сценариев. Многое из [...]]]></description>
			<content:encoded><![CDATA[<p>В настоящее время существует огромное количество средств для создания по  истине интерактивных веб приложений. Среди наиболее популярных стоит отметить  ASP, Perl и <strong>PHP</strong>. Эти средства прочно вошли в жизнь веб-разработчика. На данный  момент самым быстро развивающимся является <a href="http://about-programming.ru/category/php.html">язык PHP</a>. Поэтому рассмотрим его  возможности более подробно.</p>
<p>PHP является внедряемым языком сценариев. Многое из его синтаксиса  заимствовано из C, Java и Perl с некоторыми, заложенными в него, уникальными  особенностями. Цель языка состоит в том, чтобы позволить веб-разработчикам  быстро создавать динамически генерируемые страницы.<span id="more-469"></span></p>
<p>Развитие Сети диктует свои требования по предоставлению пользователю  интересующей его информации. Сайт &#8211; это не только набор веб-страничек. Это еще и  средство для хранения информации, организации обработки запросов пользователя и  создания адекватного ответа на пользовательский запрос.</p>
<p>Хранить информацию на сервере можно несколькими способами. Первый – с  использованием баз данных. Очень удобный способ хранения больших объемов  информации, когда необходимо организовывать выборки, сортировать информацию по  различным параметрам и т. д. Если же необходимо обработать небольшой объем  информации, да еще и без каких–то ухищрений (например, организовать учет  посещений), то подойдет второй способ – размещение информации в файлах.</p>
<p><strong>PHP</strong> предоставляет очень большой набор средств по работе с файлами и файловой  системой. Рассмотрим подробнее некоторые функции для работы с файлами.</p>
<p>Естественно, для начала работы с файлом его надо открыть. Для этого  предназначена функция <strong>fopen()</strong>. Эту функцию можно использовать для  открытия любого файла в файловой системе сервера через HTTP или FTP:</p>
<pre>int fopen(string filename, string mode);</pre>
<p><strong>filename</strong> – имя открываемого файла, <strong>mode</strong> – указатель на режим  открытия файла. Он может принимать одно из следующих значений:</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<table border="0" cellspacing="1" cellpadding="4" width="100%">
<tbody>
<tr>
<td width="30%" align="middle" valign="top"><strong>Значение</strong></td>
<td width="70%" align="middle" valign="top"><strong>Описание</strong></td>
</tr>
<tr>
<td width="30%" align="middle" valign="top">a</td>
<td width="70%" valign="top">Открыть файл только для дополнений. Данные дописываются в конец  файла.</td>
</tr>
<tr>
<td width="30%" align="middle" valign="top">a+</td>
<td width="70%" valign="top">Открыть файл для дополнения и чтения. Данные дописываются в конец  файла.</td>
</tr>
<tr>
<td width="30%" align="middle" valign="top">r</td>
<td width="70%" valign="top">Открыть файл только для чтения.</td>
</tr>
<tr>
<td width="150" align="middle" valign="to">r+</td>
<td width="70%" valign="top">Открыть файл для чтения и дополнения. Данные дописываются в начало  файла.</td>
</tr>
<tr>
<td width="30%" align="middle" valign="top">w</td>
<td width="70%" valign="top">Открыть файл только для записи. Существующие данные будут  утрачены.</td>
</tr>
<tr>
<td width="30%" align="middle" valign="top">w+</td>
<td width="70%" valign="top">Открыть файл для чтения и записи. Существующие данные будут  утрачены.</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>При работе с двоичным файлом, необходимо указать флаг <strong>b</strong>. Однако, если  между двоичными и текстовыми файлами не делается различия (как в системе Unix),  то этот флаг игнорируется.</p>
<p>При успешном выполнении функция <strong>fopen()</strong> возвращает дескриптор файла,  который представляет собой целое число. Этот дескриптор предназначен для ссылок  на файл при последующих вызовах функций работы с файлами. При неудаче  возвращается <strong>false</strong>.</p>
<p><em>Пример:</em></p>
<p><code>
<pre>$file_hendel = fopen("report", "a");
if (!$file_hendle)
      {
   echo("Невозможно открыть
      файл...");
   }
else {
   //
      функции работы с файлами;
   }</pre>
<p></code></p>
<p>По завершении работы с файлом необходимо его закрыть:</p>
<pre>int fclose(int fp)</pre>
<p>В качестве аргумента, функция <strong>fclose()</strong> принимает дескриптор  закрываемого файла. В случае успеха возвращается <strong>true</strong>, в случае неудачи –  <strong>false</strong>.</p>
<p>Просто так файлы открывать бессмысленно. С ними надо что–то делать. Первое,  что приходит на ум – вывести содержимое файла на экран. Эту операцию  осуществляет функция <strong>fpassthru()</strong>:</p>
<pre>int fpassthru (int fp);</pre>
<p>Эта функция выполняет чтение с текущей позиции в открываемом файле и до его  конца, после чего она закрывает файл. В случае успеха возвращается <strong>true</strong>,  в случае неудачи – <strong>false</strong>.</p>
<p>Может не возникнуть необходимости выводить весь файл. Возможно, нам  понадобится прочесть только часть данных, для использования их на нашей  странице. Для этой цели в РHP есть несколько функций.</p>
<p>Для чтения заданного количества символов из открываемого файла, можно  воспользоваться функцией <strong>fread()</strong>:</p>
<pre>string fread(int fp, int length);</pre>
<p>Функция читает строку длиной <strong>length</strong> символов из файла с дескриптором  <strong>fp</strong>. Пример:<br />
<code>
<pre>$file_hendel=fopen("text.txt", "r");
   if
(!$file_hendle) {
      echo("Невозможно
открыть файл...");
      }
   else
 {
      $text = fread($file_hendel, 5);
//Считывается первые 5
символов
      fclose($file_hendel);
      }</pre>
<p></code><br />
Если конец файла достигнут раньше длины <strong>length</strong>, то возвращается весь  прочитанный текст.</p>
<p>Так же для чтения данных из файла применяются функции <strong>fgetc()</strong>,  <strong>fgets()</strong> и <strong>fgetss()</strong></p>
<pre>string fgets(int fp, int length);
string fgetss(int fp, int length);</pre>
<p>Функция <strong>fgetc()</strong> производит считывание одного символа.</p>
<p>Функция <strong>fgets()</strong> возвращает строку из (<strong>length–1</strong>) символов.  Чтение завершается, если будет достигнут символ перевода строки или конец  файла.</p>
<p>Функция <strong>fgetss()</strong> идентична <strong>fgets()</strong>, но все теги HTML удаляются  из строки, но учитываются в длине строки <strong>length</strong>.</p>
<p>При ошибке эти функции возвращают <strong>false</strong>.</p>
<p>Также, для чтения содержимого файла можно использовать функцию <strong>file()</strong>,  возвращающую содержимое файла в виде массива. Каждая строка файла представляется  в виде элемента массива:</p>
<pre>array file(string filename);</pre>
<p>Функция принимает в качестве аргумента не дескриптор файла, а строку с именем  файла.</p>
<p>Для записи в файл используются функции <strong>fputs()</strong> и <strong>fwtite()</strong>.</p>
<pre>int fputs(int fp, string string, [int length]);
int fwrite(int fp, string string, [int length]);</pre>
<p>Если последний параметр не указан, то осуществляется запись всей строки.  Пример (учет посещений с занесением данных о дате посещения и IP посетителя в  файл и вывода на экран сообщения о номере посещения):</p>
<pre>&lt;?php
//Учет посещений
// количество посетителей будем хранить в файле report
$date=date("d M Y, H:i:s");
$ip=getenv("REMOTE_ADDR"); // опредляем IP узла
$host = gethostbyaddr($ip); // определяем имя узла по его IP
$str=(       // формируем строку,
Date – $date // для размещения ее в файле
Host – $host // учета IP – $ip
–––––––––––––––––––––");
$file_hendle = fopen("report", "a+"); //открываем файл report для добавлений,
fputs($file_hendle,$str); // записываем в него подготовленную строку и
fclose($file_hendle); // закрываем файл
// Определние и вывод порядкового номера посетителя
// количество посетителей будем хранить в файле visitors
// открываем файл visitors для перезаписи
$file_hendle = fopen("visitors", "w+");
$visitor_number = fread($file_hendle, filesize("visitors"));
$visitor_numbe++; // прибавляем еще одного посетителя,
rewind($file_hendle);
fwrite($file_hendle,$visitor_numbe); // переписываем файл visitors и
fclose($file_hendle); // закрываем файл
echo ("Поздравляем, вы $visitor_numbe посетитель!");
?&gt;</pre>
<p>Существует также несколько функций для управления текущей позицией в файле.  Они облегчают свободное перемещение по файлу.</p>
<p>Функция <strong>rewind()</strong> устанавливает текущую позицию в начало файла,  дескриптор которого она принимает в качестве аргумента.</p>
<p>Может возникнуть необходимость определить текущее положение в файле. Для этой  цели служит функция <strong>ftell()</strong></p>
<pre>int ftell(int fp);</pre>
<p>С помощью функции <strong>fseek()</strong> можно переместиться в заданную позицию.</p>
<pre>int fseek(int fp, int offset [, int whence]);</pre>
<p>Основными аргументами функции являются дескриптор файла и значение заданной  позиции от начала файла. Например, с помощь функции ftell() можно организовать  перемещение в заданную позицию:</p>
<pre>fseek($fp, ftell($fp)+10); // переход на 10 позиций вперед от текущей</pre>
<p>Но этого же эффекта в PHP4 можно добиться без использования функции ftell(),  так как в функции fseek() появился необязательный аргумент, который определяет  способ перемещения на заданную позицию:<br />
<strong>SEEK_SET</strong> – отсчитывает  значение от начала файла (по умолчанию);<br />
<strong>SEEK_CUR</strong> – отсчитывает  значение от текущей позиции;<br />
<strong>SEEK_END</strong> – прибавляет значение  <code>offset</code> к концу файла.</p>
<p>Тот же пример в PHP4 примет вид:</p>
<pre>fseek($fp, 10, SEEK_CUR);</pre>
<p>Часто возникают ситуации, когда надо проверить положение указателя  относительно конца файла. Для этого применяется функция <strong>feof()</strong>, которая  возвращает true, если достигнут конец файла и <strong>false</strong>, если конец файла не  достигнут.</p>
<p>Возможности PHP по работе с файлами не ограничиваются приведенными здесь  функциями. С полным описанием функций для работы с файловой системой можно  ознакомится на официальном сайте PHP в разделе PHP:Manual:Filesystem functions.</p>
<p>Мой блог о программировании находят по следующим фразам</p>
<ul>
<li><a href="http://about-programming.ru">Все о программировании</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/php.html">язык PHP</a></li>
<li><a href="http://about-programming.ru/category/php.html">php программирование</a></li>
<li><a href="http://about-programming.ru">языки программирования скачать</a></li>
<li><a href="http://about-programming.ru/category/assembler.html">язык программирования assembler</a></li>
<li><a href="http://about-programming.ru/category/delphipascal.html">программирование на pascal</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://about-programming.ru/php/469.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
