十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
open函數(shù)用來打開一個文件,其調(diào)用的一般形式為:
網(wǎng)站設計制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺管理系統(tǒng);成都網(wǎng)站建設、網(wǎng)站制作收費合理;免費進行網(wǎng)站備案等企業(yè)網(wǎng)站建設一條龍服務.我們是一家持續(xù)穩(wěn)定運營了10余年的成都創(chuàng)新互聯(lián)網(wǎng)站建設公司。
文件指針名=fopen(文件名,使用文件方式);
其中,
“文件指針名”必須是被說明為FILE
類型的指針變量;
“文件名”是被打開文件的文件名;
“使用文件方式”是指文件的類型和操作要求。
“文件名”是字符串常量或字符串數(shù)組。
例如:
FILE
*fp;
fp=("file
a","r");
其意義是在當前目錄下打開文件file
a,只允許進行“讀”操作,并使fp指向該文件。
又如:
FILE
*fphzk
fphzk=("c:\\hzk16","rb")
其意義是打開C驅(qū)動器磁盤的根目錄下的文件hzk16,這是一個二進制文件,只允許按二進制方式進行讀操作。兩個反斜線“\\
”中的第一個表示轉(zhuǎn)義字符,第二個表示根目錄。
使用文件的方式共有12種,下面給出了它們的符號和意義。
文件使用方式
意義
“rt”
只讀打開一個文本文件,只允許讀數(shù)據(jù)
“wt”
只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)
“at”
追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)
“rb”
只讀打開一個二進制文件,只允許讀數(shù)據(jù)
“wb”
只寫打開或建立一個二進制文件,只允許寫數(shù)據(jù)
“ab”
追加打開一個二進制文件,并在文件末尾寫數(shù)據(jù)
“rt+”
讀寫打開一個文本文件,允許讀和寫
“wt+”
讀寫打開或建立一個文本文件,允許讀寫
“at+”
讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)
“rb+”
讀寫打開一個二進制文件,允許讀和寫
“wb+”
讀寫打開或建立一個二進制文件,允許讀和寫
“ab+”
讀寫打開一個二進制文件,允許讀,或在文件末追加數(shù)據(jù)
對于文件使用方式有以下幾點說明:
1)
文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:
r(read):
讀
w(write):
寫
a(append):
追加
t(text):
文本文件,可省略不寫
b(banary):
二進制文件
+:
讀和寫
2)
凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。
3)
用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。
4)
若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。
5)
在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應的處理。因此常用以下程序段打開文件:
6)
if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror
on
open
c:\\hzk16
file
指針是c語言的概念,VB、VB.NET沒有指針,除了指針以外也很少有人能玩到你的編程深度,關鍵看不懂呢。
???就是子程序的名稱,比如每次點擊c后就自動調(diào)動相對應的子程序,如子程序是
Private Sub my_do ()
........
End Sub
相應的AddHandler c.Click, AddressOf my_do
實際上是個委托
vb.net雖也有input語句,但一次只能讀取到一個變量中,可以用TextFieldParser類代替,但似乎沒以前的方便。不過比以前的更靈活。寫入文件Write還是可以用,在Microsoft.VisualBasic.FileIO中。
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
Dim?fileName?As?String?=?"E:\User?Documents\Master\My?Documents\電子閱讀\股票\table2.csv"
Using?Recrods?As?New?Microsoft.VisualBasic.FileIO.TextFieldParser(fileName)?'建立TextFieldParser對象
'MyReader.TextFieldType?=?FieldType.Delimited
Recrods.SetDelimiters(",")?'把字段分隔符設置為","
Dim?curRow()?As?String
Do?Until?Recrods.EndOfData
curRow?=?Recrods.ReadFields()?'讀取記錄行,返回字符串數(shù)組,所以不同字段類型需要自己轉(zhuǎn)換。
Debug.Print(Join(curRow,?vbTab))
Loop
End?Using
End?Sub
例1:以下程序我們申請幾個指向不同類型的指針:
’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結構的元素在內(nèi)存中按其出現(xiàn)的順序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一個4字節(jié)數(shù)組指針
Dim tabytTest(3) As Byte
’以下語句告訴net垃圾回收進程不對tabytTest進行處理,也就是說tabytTest占用的內(nèi)存區(qū)域固定不變。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節(jié)數(shù)組的指針
’取得一個指向32位內(nèi)存數(shù)據(jù)的指針,
’由于使用gchandle取指針的方法只能對引用的對象有效,
’所以對如int32等值類型必須使用將其封裝成為一個對象的方法以變?yōu)橐妙愋?/p>
Dim ti32Test As Object = Convert.ToInt32(0)
’以下語句告訴net垃圾回收進程不對ti32test進行處理,也就是說ti32Test的內(nèi)存位置固定不變。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于結構是一種值類型變量,為保證指針申請方便,我們申請
’取得一個和結構tudtTest1大小一致的字節(jié)數(shù)組指針,只要空間占用長度和結構一樣就可以了
’由于net在結構封裝中會插入額外的數(shù)據(jù)位,所以一定要用sizeof方法得到結構在非托管使用時的實際大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結構的指針
’在這兒你可以寫對指針處理的任意代碼(在例2中會給予補充)……
’在使用完畢后一定要釋放指針指向的內(nèi)存塊,讓垃圾回收器可對這個內(nèi)存塊回收處理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function
上例中指針流程處理可以歸納為:
1、 定義一個具有合適內(nèi)存長度的引用變量(關于引用變量和值變量的差異可以參觀VB.NET的書籍)
2、使用GCHandle.Alloc方法將變量的內(nèi)存區(qū)域固定下來。
3、使用GCHandle對象的AddrOfPinnedObject取得該內(nèi)存區(qū)域的首地址并賦值給指針變量.
4、對指針進行操作
5、使用GCHandle對象的free方法釋放指針指向的內(nèi)存區(qū)域以便net垃圾回收器可以回收這個內(nèi)存空間
2、指針所指向數(shù)據(jù)的存取
在.net中,對指針指向數(shù)據(jù)的存儲函數(shù)都封裝在marshal類中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針所表示的地址中寫入XXX類型的數(shù)據(jù),而ReadXXX中作用就是將指針所在地址的數(shù)據(jù)以XXX類型方式讀出??蠢?,我們使用這些方法演示對例1那幾個指向不同類型數(shù)據(jù)的指針作數(shù)據(jù)存/取操作。
例2:演示向例1申請得到的幾個指針執(zhí)行寫入及讀取數(shù)據(jù)的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫入32位整數(shù)77
MsgBox("現(xiàn)在ti32Test的值為:" ti32Test) ’因為變量存儲地址的數(shù)據(jù)已改為77,所以顯示為77
’以下這句之所以可行,因為ti32Test是32位整數(shù),而tpObject指向的tabytTest數(shù)組剛好有4個元素
’而每一個byte元素都占用8位,合起來就是32位,和ti32Test占用的空間一樣。這就印證了前面提’
’到的net中指針沒有指向類型的說明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代碼再將tabytTest字節(jié)數(shù)組的內(nèi)容理解為一個int32整數(shù),
’并將值賦值給tudtTest結構中的int32元素
’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結構中的內(nèi)存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時產(chǎn)生了
’一個指針并指向i32a所在的內(nèi)存地址(, 這個方法也說明了指針可以以字節(jié)為單位進行加減計算以指向合適的變量。
’Marshal.ReadInt32的作用是從指針中讀取一個32整數(shù)。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’這兒可以將字節(jié)數(shù)組的內(nèi)容復制到真正的結構中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("結構tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77
數(shù)組好像沒有快速賦值吧,或者你再把問題再清楚一點。
語句執(zhí)行時間倒是可以做到。在語句前
Dim oldTime As Date = Now
在過程語句后加
Dim newTime As Date = Now
Dim differenceInSeconds As Long = DateDiff(DateInterval.Second, oldTime, newTime)
textbox1.text= "共用了:" differenceInSeconds "秒!"