星期四, 7月 06, 2006

Socket with C

開個socket 就要 "include winsock2.h" 才有會個特異功能,這很正常的杯.
java 就要 import java.net.

而C的funtion裡面常有的縮寫
AF PF
PF -> protocaol family
其實沒啥差別

SOCK_STREAM
SOCK_DGRAM
SOCK_RAW <--特別的方式可以聽到IP層的資料.如icmp
有趣的是socket(int,int,int)都可以是int型態.也就是給數字也通的樣子.

socket_in 是寫一些網路資訊的資料結構

可以利用bind 和 connect 的funtion去把socket和這些資料連接
bind 結合參數 <-多用於server
connect是連線 <-多用於client
listen(socket , int) <--當完成 bind 後就可以利用來等連線 ,後面的int為連線數
accept(socket,sockaddr,int) 接受連線 <--準備傳資料啦.當後面兩個arg都為 null的時候表示不介意連線的點為何.
最後到了傳送的部份是send 和 recv .
當然還有UDP用的recvfrom 和 sendto.<-UDP要對方位置

架構概念 和java有點不一樣
socket -> bind -> listen -> accept -> recv && send
sockaddr_in sockaddr_in

下面是這次寫的小範例,不過在檔案部份小懶惰,沒寫好,所以有要copy得人要小心一點
//------------------------------------------------------------------------//
#include
#include
#include
#include "winsock2.h"
#pragma comment(lib,"ws2_32")
using namespace std;
void main() {

char readc[100000];
ifstream inFile("aaa.cmp", ios::binary);
ofstream out("bbb.txt",ios::binary);
long nFileSize= inFile.tellg();




// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
//-------------初始化 winsock很重要...沒有就不會動了
// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}

// Bind the socket.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
service.sin_port = htons( 27015 );


if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(m_socket);
return;
}

// Listen on the socket.
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");

// Accept connections.
SOCKET AcceptSocket;

printf( "Waiting for a client to connect...\n" );

int bytesSent=SOCKET_ERROR;
while (1) {
AcceptSocket = SOCKET_ERROR;

while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}

printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}

// Send and receive data.


while(inFile)
{
inFile.read(readc,100000);
bytesSent = send( m_socket, readc, 100000, 0 );
}

out.close();
inFile.close();



closesocket(m_socket);


}

星期三, 7月 05, 2006

C檔案串流

ifstream is(pFilename, ios::in|ios::binary);
is.seekg(0, ios::end); // 移到檔尾
long nFileSize= is.tellg(); // 看看長得檔案長度
is.seekg(0, ios::beg); // 移到檔頭
char* pBuf = new char[nFileSize]; // 配置記憶體
is.read(pBuf, nFileSize); // 讀取資料
is.close(); // 關檔
// ... 要做的事

星期二, 7月 04, 2006

C++ 歷史 with CLI

* BCPL (Basic Computer Programming Language)
* B (Ken Thompson, original UNIX work)
* C (Dennis Ritchie, adding type and control structure to B)
* C with Classes (~1979)
* C84 (~1984)
* Cfront, release E (~1984-to universities)
* Cfront, release 1.0 (1985-to the world )—20th birthday
* Multiple/Virtual Inheritance (MI) programming (~1988)
* Generic Programming (~1991) (templates)
* ANSI C++/ ISO-C++ (~1996)
* Dynamic Component programming (~2005) (C++/CLI)

pragma

在所有的預處理指令中,#Pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。
其格式一般為: #Pragma Para
其中Para 為參數,下面來看一些常用的參數。

(1)message 參數。 Message 參數是我最喜歡的一個參數,它能夠在編譯資訊輸出窗
口中輸出相應的資訊,這對於源代碼資訊的控制是非常重要的。其使用方法為:
#Pragma message(“消息文本”)
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本列印出來。
當我們在程式中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什麼地方定義了_X86這個宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
當我們定義了_X86這個宏以後,應用程式在編譯時就會在編譯輸出窗口裏顯示“_
X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了


(2)另一個使用得比較多的pragma參數是code_seg。格式如:
#pragma code_seg( ["section-name"][,"section-class"] ] )
它能夠設置程式中函數代碼存放的代碼段,當我們開發驅動程式的時候就會使用到它。

(3)#pragma once (比較常用)
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經有了,但是考慮到相容性並沒有太多的使用它。

(4)#pragma hdrstop表示預編譯頭文件到此為止,後面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈結的速度,但如果所有頭文件都進行預編譯又可能佔太多磁片空間,所以使用這個選項排除一些頭文件。
有時單元之間有依賴關係,比如單元A依賴單元B,所以單元B要先於單元A編譯。你可以用#pragma startup指定編譯優先級,如果使用了#pragma package(smart_init) ,BCB就會根據優先級的大小先後編譯。

(5)#pragma resource "*.dfm"表示把*.dfm文件中的資源加入工程。*.dfm中包括表單
外觀的定義。

(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等價於:
#pragma warning(disable:4507 34) // 不顯示4507和34號警告資訊
#pragma warning(once:4385) // 4385號警告資訊僅報告一次
#pragma warning(error:164) // 把164號警告資訊作為一個錯誤。
同時這個pragma warning 也支援如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
這裡n代表一個警告等級(1---4)。
#pragma warning( push )保存所有警告資訊的現有的警告狀態。
#pragma warning( push, n)保存所有警告資訊的現有的警告狀態,並且把全局警告
等級設定為n。
#pragma warning( pop )向棧中彈出最後一個警告資訊,在入棧和出棧之間所作的
一切改動取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在這段代碼的最後,重新保存所有的警告資訊(包括4705,4706和4707)。
(7)pragma comment(...)
該指令將一個註釋記錄放入一個對象文件或可執行文件中。
常用的lib關鍵字,可以幫我們連入一個庫文件。


每個編譯程式可以用#pragma指令激活或終止該編譯程式支援的一些編譯功能。例如,對迴圈優化功能:
#pragma loop_opt(on) // 激活
#pragma loop_opt(off) // 終止
有時,程式中會有些函數會使編譯器發出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,可以這樣:
#pragma warn —100 // Turn off the warning message for warning #100
int insert_record(REC *r)
{ /* function body */ }
#pragma warn +100 // Turn the warning message for warning #100 back on
函數會產生一條有唯一特徵碼100的警告資訊,如此可暫時終止該警告。
每個編譯器對#pragma的實現不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。

星期一, 7月 03, 2006

STL container

這邊要開始瞭解STL container的運作方式了

Container裡面使用的都是call by value

Step 1:
也是一般程式都應該要做的,就是initialization,有初始也就有解構.
Step 2:

星期日, 7月 02, 2006

STL-PART II

STL 's componets

Containers (容器): This's to management the object of set, 每個 Containers 都會有各自的優點和缺點,也因為不同的需求有不同的類型.

Iterators (迭代器): 用來巡訪collection of objects

Algorithms (演算法): 故名思義

再來要學會怎用STL

可以先
#include
去使用看看 使用方式和tempelate蠻像的
list<型態> variable

之後就像一般的物件方式使用,感覺還蠻愉快的.

STL(Standard Template Library)

果然,之前想到的現在果然碰到了.一切都還是要標準化.

本次參考書為侯捷譯的C++標準函式庫.

首先就是要會用杯
然後瞭解
最後就是X他啦

最X的STL應該就是好用 安全 速度快吧?之後大概是Generic Programming

------------------------------------------------------------------------
STL六個組件container algorithm iterator adapterr functor allocator

Generic 要符合 Template 的形式所以程式庫內所有的東西都被設計為Template

初探 End..

星期四, 6月 15, 2006

Dshow Filter trace的方法

學Dshow filter要怎樣開始?和學Driver一樣,開始總是讓人很迷惑的,在此我小小的整理一下我學到的方法.
Step 1:

首先當然要先安裝" DirectX SDK " 到www.mircosoft.com 去找看看要找完整版的,

Step 2:

我們先打開graphedit,先看看我們有哪些filter,稍後我在教大家怎裝新的codec
graphedit

Graphedit codec

當然這只是先讓大家暖暖身,先把必要的工具準備一下吧.
請安裝 VC++ 或其他好trance的工具

Step 3:

先將 Filters.dsw 編過
x:\DXSDK\Samples\C++\DirectShow\Filters\Filters.dsw

Step 4:

我們主要是練習所以dump編過之後註冊一下
C:\DXSDK\Samples\C++\DirectShow\Filters\Dump\dump.dsw
VC的tool -> Register tool 點一下就註冊了

打開Graphedit後,就可以發現出現了Dump的filter

Step 5:

再來請參考一下這篇
znikang

完成上動作之後算完成了開始的一大半.

接下來我們拿一個wmv轉YUV的例子,來練習我的dump

Step 6:

先將一個wmv拉進Graphedit,就可以看到這個壓縮檔的組成,我在這邊要把不需要的東西換掉.






完成後存一個GRF檔,接下來是VC的部份

Step 7:

打開dump.dsw專案.

利用編譯旁邊的小手,或按下F9 開始在程式碼上標上標記.



設定一下執行環境




完成後就可以按下F5開始trace啦,按下後會先執行Graphedit,按下run後,只要到程式的部份,就會停到剛剛下標記的地方,這樣就可以好好的去認識一下Dshow啦.

其他的就靠自己了.

星期三, 4月 12, 2006

Compiler && debain

3.7.3 Flex – 更好的 Lex

flex 是一個快速的字詞分析產生器。

flex 的參考資料:

*

info flex (tutorial)
*

flex(1)

需要提供你自己的 main() 和 yywrap() ,或者你的 program.l 在不用 library 時應該看起來看像這樣 (yywrap是一個巨集;%option main 隱含地打開了 %option noyywrap):

%option main
%%
.|\n ECHO ;
%%

另外,還可以在 cc 命令列末尾加上 -lfl 連接器的選項來進行編譯 (就像 AT&T-Lex 使用 -ll 一樣),此時就不需要 %option 了。
13.7.4 Bison – 更好的 Yacc

Debian 中有幾個套件提供了與 Yacc 兼容的 LALR 文法分析生成器:

*

bison: GNU LALR 文法分析產生器
*

byacc: The Berkeley LALR 文法分析產生器
*

btyacc: Backtracking parser generator ,以 byacc 為基礎

bison 的參考資料:

*

info bison (tutorial)
*

bison(1)

需要提供自己的 main() 和 yyerror() 。 main() 呼叫 yyparse() ,而 yyparse() 呼叫 yylex() ,通常由 FleX 建立。

%%

%%

13.7.5 Autoconf

autoconf 一個 shell script 生成工具,由它生成的 script 能自動設定軟體的源碼套件,以適用於各種使用完整 GNU build 系統的 UNIX-like 系統。

autoconf 會產生設定 script 的 configure。 configure 使用 Makefile.in 模版來自動建立適合的 Makefile。
13.7.5.1 編譯和安裝程式

Debian 不會改動 /usr/local/ 下的文件 (參閱 多樣性支援, 第 2.5 節)。所以如果是從源碼來編譯程式,並將其安裝到 /usr/local/ 下,就不會影響到 Debian。

$ cd src
$ ./configure --prefix=/usr/local
$ make
$ make install # 這會把檔案放到系統中


Debain

星期六, 4月 08, 2006

影像處理篇

Video Renderer (VR)是接收RGB/YUV裸数据,然后在显示器上显示的Filter。
VR会优先使用DirectDraw以及Overlay表面;如果这些特性得不到显卡的支持,VR会使用GDI函数进行画图。在上级Filter连接到 VR时,VR总是先要求当前显示器设置的色彩位数的RGB格式,如你的机器设置的是24位彩色,则VR首先要求连接的Media type为RGB24。如果你的显卡支持YUV Overlay表面,那么在Filter Graph运行起来的时候,VR会动态改变已经连接的Media type,要求上级Filter输出一种合适的YUV格式。VR Filter上实现了IVideoWindow接口,Filter Graph Manager主要通过这个接口来控制视频窗口。

大陸仔

Video Mixing Render VRM就是混合的Render
VMR-9 實際上是一個功能強大的即時數位訊號處理器 (DSP)。視訊可以很簡單地轉換至材質上。例如,在旋轉的立方體表面上播放視訊。若您是遊戲開發人員,視訊將不再限於低解析度的過場短片。您可以結合視訊與 3D 圖形,建立像圖形一般動態、互動的視訊短片。

就是說,遊戲畫面的3D空間就是用VMR來讓大家看到的
微軟定義的VMR9

dshow範例

#include

#include

#define FILENAME L"c:\\DXSDK\\Samples\\Media\\butterfly.mpg"

int
main()
{
IGraphBuilder *pGraphBuilder;
IMediaControl *pMediaControl;
IMediaEvent *pMediaEvent;
long eventCode;
IVideoWindow *pVideoWindow;

CoInitialize(NULL);

CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder,
(LPVOID *)&pGraphBuilder);

pGraphBuilder->QueryInterface(IID_IMediaControl,
(LPVOID *)&pMediaControl);

pGraphBuilder->QueryInterface(IID_IMediaEvent,
(LPVOID *)&pMediaEvent);

pMediaControl->RenderFile(FILENAME);

pGraphBuilder->QueryInterface(IID_IVideoWindow,
(LPVOID *)&pVideoWindow);

pVideoWindow->put_Caption(L"THIS IS A TEST");

pMediaControl->Run();

pMediaEvent->WaitForCompletion(-1, &eventCode);

pMediaEvent->Release();
pMediaControl->Release();
pGraphBuilder->Release();
CoUninitialize();

return 0;
}

一個使用ivideowindow的實例,如果不用的話就會叫一個acitvewindows
注意看上面的"THIS IS A TEST"

星期六, 3月 18, 2006

MFC

今天繼續討論這個機歪的寫作
由於有個怪匈牙利人,就有怪縮寫方式
handld of instance -> hinstance
handld of windows -> hwnd

好難去瞭解

在MFC有個架構document / view
其實應該分成操作介面/核心
而核心就是演算部份的code,

而document就是演算部份,而view就是資料顯示的部份

星期六, 3月 11, 2006

Direct X and VC

要寫和執行Direct X 9.0
Direct X 9.0 runtime 會在安裝SDK時就安裝上去
Dirctx 9.0 SDK(軟體開發套件) http://msdn.microsoft.com/librart/default.asp?url=downloads/list/directx.asp

安裝SDK後
需要開起VC++(6.0) 選擇 Tools>Options>Directories 加上DirectX的標頭檔目錄

VC++(7.0) Tools>Options>Projexts Folder>VC++ Directories

加上DXSDK/Include/ 和 DXSDK/Lib/

開新檔流程

先開一個空白Project (Win32 Application)之後加入 d3d9.lib d3dx9.lib winmm.lib 至
Project>Settings>Link (6.0)
Project>Properties>Linker>Input Folder(7.0)
之後就可以編譯

星期二, 3月 07, 2006

Pattern Recognition.

建立學生於圖型識別之理論及實務基礎,以使其修畢課程後具有利用電腦進行各種型態資料如文字、影像、聲音的分類與辨識之技能。

這是我從網路上找到的一些課程大綱.

其實做識別技術還有其他的應用如:
文字識別、文件分析、生物認證、視訊監控、行為分析、智慧型運輸系統、影像壓縮、目標偵測與追蹤、影像與視訊檢索

需要很多的基礎技術,如Datamining,影像處理,機率,...等.就讓我來開始這份學期的報告吧.

還沒上這門課的時候是覺得,是一門影像處理的進階技術,用一些圖型邊界的技術如,sobel之類的進行實務上的學習,但就這樣嗎?今天能抓出一張圖片的一些圖,請問一下,不同張圖,你的設定值是否都一定?所以就必須先利用Datamining進行資料的截取,先分析後才去修改演算法.而Datamining演算法又是由機率的演算法演進的,由這些技術為基底之後,就可以去分別出你想找出的東西.

有這麼簡單嗎?...

元智大學 Pattern Recognition. lab

下回在續

星期六, 2月 04, 2006

簡單的基礎Linux debian

  • 4.5.4 時間戳記

    在 GNU/Linux 檔案中,有三個時間戳記:

    • mtime:修改時間 (ls -l) ,

    • ctime:狀態改變時間 (ls -lc) 和

    • atime:最後存取時間 (ls -lu) 。

    注意, ctime 並不是檔案建立時間。

    • 覆寫檔案會改變檔案的 mtimectimeatime 全部的時間戳記。

    • 改變檔案權限或擁有者的話,會改變檔案的 ctimeatime 時間戳記。

    • 讀取檔案會改變檔案的 atime 時間戳記。

    要注意的是,在 GNU/Linux 系統中,即使只是簡單的讀取檔案,通常也會為了要更新 inode 中的 atime 而導致寫入的動作。如果以 noatime 選項來掛上檔案系統的話,就可以略過這個動作而使讀取的動作加快。請參閱 mount(8)

    使用 touch(1) 中的指令來改變檔案的時間戳記。

    • / 代表 root 目錄。

  • /etc/

    • 所有的系統設定檔案皆放在該目錄下。

  • /var/log/

    • 所有的系統日誌檔皆放在該目錄下。

  • /home/

    • 該目錄包含了非特權帳號的所有家目錄。

星期日, 11月 27, 2005

BTC 程式 原理

BTC的運作方式,以下由程式碼轉成一般人能看的語言

首先 要決定區塊大小 實驗中以 4 * 4 為單位

然後抽取影像中的4x4區塊 而且會重疊

抽取之後,取其所有元素的平均值 sum()/16;

將區塊大於平均值的數設為1小於的數設為0並型成一個 "1的位元矩陣".
在將其中有1的值加總後得到一個值k
1位元矩陣乘上原始區塊並加總之後除以K就可以得到屬於1的"平均數"

在將"1的位元矩陣"取反閘(not)之後 就可以得到 "0的位原矩陣"
在求0位元矩陣乘上原始區塊並加總之後除以K就可以得到屬於0的"平均數"

在製造三個舉陣
m_H 存放1的平均數
m_L 存放0的平均數

matrice存放"1的位元矩陣"最後會的到和原影像相同大小 "1的位元矩陣"

即完成壓縮

解壓縮就以"位元矩陣"乘上m_H or m_L的平均數 即會還原影像.

星期日, 11月 20, 2005

C/C++ 檔案輸入/出

7.4二進位檔案的輸入/輸出

要存取檔案的二元(binary)資料,首先必須指定開啟模式為ios::binary,一旦檔案開啟模式為binary,則所有的資料將以二進位形式存檔,就算是空白字元,tab字元,或是換行字元,都會以字元的二進位形式存檔,整數、浮點數就分別以其資料型別所佔的位元空間來儲存二進制資料,不管資料內容是什麼都不會作字元自動轉換。



put() 和 get()



除了宣告檔案輸入/輸出物件開啟模式為ios::binary外,我們還需要一些專屬於檔案物件的函式來存取二進制資料(有時也稱為非格式化資料),兩個最基本的函式是不可或缺的:

put(char)

get(char)

這兩個函式提供以字元存取的方式來使用非格式化資料。其中get( )函式屬於ifstream的成員函式,功能是從二進制檔案中讀取一個字元;而put( )則屬於ofstream的成員函式,功能是將一字元寫入二進制檔案中。

下面的程式為顯示檔案內容(“ex2.txt”)到螢幕上,並且判斷是否包含文字或二進位資料. 它使用get( ) 函式.

範例程式7-7使用put( )將ASCII碼0到255所對應的所有字元寫入檔案中。由於ASCII碼只使用一半作為可見的字元,另一半則是延伸字元集並且包含一些特殊符號和控制碼。



/*----------------------------------------------------*/

// 範例程式7-7

// 使用put( )函式

// 陳慶瀚,2001

/*----------------------------------------------------*/

#include "fstream.h"

void main()

{

char c;

ofstream out("ex2.txt", ios::binary); //宣告一個二進制的輸出檔案物件

for(int i=0; i<256; i++)

{

c = (char) i; //將整數轉為字元

out.put(c); //使用out的成員函式將單一字元存入二進制的檔案中

}

out.close();

}

執行這個程式,隨後開啟ex2.txt,你應該看到類似下列的結果

......!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€????????????????﹜ㄓ它夾帚型陋秣捲陷絮溢劃遞蝨螃謝藥齪圴佮迓玿旂衲欶......

除了英數字之外,看起來還夾雜著很多的亂碼,這些都是ASCII碼中不可見字元或特殊符號。



/*----------------------------------------------------*/

// 範例程式7-8

// 使用get( )函式

// 陳慶瀚,2001

/*----------------------------------------------------*/

#include

void main()

{

char ch;

ifstream in("ex2.txt", ios::binary); // 宣告一個二進制的輸入檔案物件

while(in)

//如果檔案物件指標指向檔案底端,則in傳回0,迴圈中斷

{

in.get(ch); //使用in的成員函式get()讀取一個字元

cout << ch;

}

}



read( ) 和 write( )



如果我們想對大量的二進制資料進行存取,fstream提供另外兩個成員函式:

istream &read(char *buf, int num);

ostream &write(const char *buf, int num);

ifstream的read( )函式從檔案一次讀取num 個字元,然後用把他們放入buf中;ofstream的write( )函式則是經由buf將num個字元一次寫入到檔案中。

範例程式7-9和7-10展示如何使用read( )和write( )。

/*----------------------------------------------------*/

// 範例程式7-9

// 使用write()一次寫入一個區塊資料

// 陳慶瀚,2001

/*----------------------------------------------------*/

#include

void main()

{

int buf [5] = {1, 2, 3, 4, 5};

ofstream out("test", ios::binary);

if(!out) //檔案開啟失敗

{

cout << "無法開啟檔案\n";

return;

}

//將buf由int型別轉為char型別,再經由out的成員函式write()寫入檔案

out.write((char *) &buf, sizeof(buf));

out.close();

}

執行這個程式,buf所含的字元資料會非常有效率的被寫入binary檔案中,如果你用文字編輯器把ex3.txt打開來看,你可能會看到如下結果:

    

似乎與相像中的結果不大一樣,這是因為binary檔案不適合以ASCII文字編輯器來閱覽,如果你使用範例程式7-10將檔案以binary模式開啟,再將資料讀入,就可以確認資料內容與寫入時是完全一致的。

/*----------------------------------------------------*/

// 範例程式7-10

// 使用read()將區塊資料一次讀取

// 陳慶瀚,2001

/*----------------------------------------------------*/

#include

void main()

{

int buf[5]={0,0,0,0,0}; //將buf初值設為0

ifstream in("test", ios::binary); //宣告檔案物件的開啟模式為binary

// 以區塊字元的格式讀取,再放入buf

in.read((char *) & buf, sizeof buf);

for(int i=0; i<5; i++) // 將buf陣列資料顯示在螢幕

{

cout << buf [i] << " ";

}

in.close();

}

星期日, 9月 25, 2005

Opera OR FireFox

是哪套流覽器好用?

FireFox 還是Opera?

http://my.opera.com/community/

http://moztw.org/


比較有趣的是Opera有聲控的功能,只要拼音拼的出來的,唸出來他就可以動,我把exit 改成Fuck
果然關了,哈哈.

不過實用性還是Firefox 可以使用Delicious 當書簽,這就有差.

星期六, 9月 24, 2005

為了養成寫程式習慣

基本上在寫程式的過程中,有須多要命名的問題,在這邊先讓自己有個習慣先.

首先,變數的一開始都為小寫的型態

int 為i
string 為s
double 為 b 以此類推


在來就是功能的敘述,第一個字母大寫

檔案就是File
名稱就是Name
合在一起就是FileName

最後為喧告出的物件型態比如說panel,button之類的

JAVA & 頭很大

雖然電腦裡開的是Eclipse,手上敲出來的語法是JAVA,但是對JAVA的許許多多的東西確不是非常的瞭解,光是在網路上的API,有時候確有看沒有懂,更別說其他的東西,所以為了讓自己更加得專注在這樣的東西上面,就來多多去研究去發掘.

星期二, 8月 02, 2005

沒搞頭的C#

又一次浪費不少時間在找一行小東西

沒想到pocket pc 上等待程式的
Cursor 和他的事件 Cursors
這樣的機車

加上原本的開IE 日期

都是Pocket上沒有的 ....挺機車的