INI 文件的操作

在程序中經常要用到設置或者其他少量數據的存盤,以便程序在下一次執行的時候可以使用,比如說保存本次程序執行時窗口的位置、大小、一些用戶設置的數據等等,在 Dos 下編程的時候,我們一般自己產生一個文件,由自己把這些數據寫到文件中,然后在下一次執行的時候再讀出來使用。在 Win32 編程中當然你也可以這樣干,但 Windows 已經為我們提供了兩種方便的辦法,那就是使用注冊表或者 ini 文件(Profile)來保存少量數據。本文中先介紹一下 .ini 文件的使用。?

ini 文件是文本文件,中間的數據格式一般為:?
[Section1 Name]?
KeyName1=value1?
KeyName2=value2?
...?

[Section2 Name]?
KeyName1=value1?
KeyName2=value2?

ini 文件可以分為幾個 Section,每個 Section 的名稱用 [] 括起來,在一個 Section 中,可以有很多的 Key,每一個 Key 可以有一個值并占用一行,格式是 Key=value,Win32 對 ini 文件操作的 api 中,有一部分是對 win.ini 操作的,有一部分是對用戶自定義的 ini 文件操作的。Win.in 和 system.ini 是Windows的兩個非常重要的初始化文件,Windows將用戶所作的選擇以及各種變化的系統信息記錄在這兩個文件中。System.ini 描述了系統硬件的當前狀態,Win.ini 文件則包含了Windows 系統運行環境的當前配置。由于 Win.ini 文件的重要性和常用性,Win32 中有專門對 Win.ini 進行操作的 api,它們是:?

GetProfileInt - 從 Win.ini 文件的某個 Section 取得一個 key 的整數值,它的原形是:?

GetProfileInt(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字符串地址?
INT nDefault // 如果 Key 值沒有找到,則返回缺省的值是多少?
);?

如果 Key 值沒有找到的話,返回值是 nDefault 指定的缺省值,如果 Key 中的值是負數,則返回 0,如果 Key 指定的是數字和字符串的混合,則返回數字部分的值,比如說 x=1234abcd,則返回 1234?


GetProfileString - 從 Win.ini 文件的某個 Section 取得一個 key 的字符串,它的原形是:?

GetProfileString(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字符串地址?
LPCTSTR lpDefault, // 如果 Key 值沒有找到,則返回缺省的字符串的地址?
LPTSTR lpReturnedString, // 返回字符串的緩沖區地址?
DWORD nSize // 緩沖區的長度?
);?

返回的字符串在緩沖區內,返回的 eax 值是返回的字符串的長度(不包括尾部的0)?


GetProfileSection - 從 Win.ini 文件中讀出整個 Section 的內容,它的原形是:?

GetProfileSection(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPTSTR lpReturnedString, // 返回數據的緩沖區地址?
DWORD nSize // 返回數據的緩沖區長度?
);?


WriteProfileSection - 將一個整個 Section 的值 寫入 Win.ini 文件的指定 Section 中,它的原形是:?

WriteProfileSection(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpString // 要寫入的數據的地址?
);?

如果 Win.ini 沒有指定的 Section,API 會新建立一個并寫入數據,如果已經存在,則先刪除原來 Seciton 中所有的 Key 值然后寫入新的。?


WriteProfileString - 將一個 Key 值寫入 Win.ini 文件的指定 Section 中,它的原形是:?

WriteProfileString(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字符串地址?
LPCTSTR lpString // 要寫的字符串地址?
);?

如果 Win.ini 沒有指定的 Section,API 會新建 Section,如果沒有指定的 Key 則新建一個 Key 并寫入數據,如果已經存在,則用字符串代替原來的值。?
以上的 Api 是對 Win.ini 操作的,當然對于我們來說,用的更多的是在程序運行的目錄中建立自己的 ini 文件,如果需要對自己的 ini 文件操作,就要用到另一組 Api,這一組 api 和上面的很象,只要把上面一組的 Profile 換成 PrivateProfile(私有的)就可以了,參數中也相應的多了一個 ini 文件名的參數。例如 GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString 等等, 下面分別介紹:?

GetPrivateProfileInt - 從 ini 文件的某個 Section 取得一個 key 的整數值,它的原形是:?

GetPrivateProfileInt(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字符串地址?
INT nDefault // 如果 Key 值沒有找到,則返回缺省的值是多少?
LPCTSTR lpFileName // ini 文件的文件名?
);?

中間參數和返回值的定義和 GetProfileInt 是一樣的。?


GetPrivateProfileString - 從 ini 文件的某個 Section 取得一個 key 的字符串,它的原形是:?

GetPrivateProfileString(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字符串地址?
LPCTSTR lpDefault, // 如果 Key 值沒有找到,則返回缺省的字符串的地址?
LPTSTR lpReturnedString, // 返回字符串的緩沖區地址?
DWORD nSize // 緩沖區的長度?
LPCTSTR lpFileName // ini 文件的文件名?
);?


GetPrivateProfileSection - 從 ini 文件中讀出整個 Section 的內容,它的原形是:?

GetPrivateProfileSection(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPTSTR lpReturnedString, // 返回數據的緩沖區地址?
DWORD nSize // 返回數據的緩沖區長度?
LPCTSTR lpFileName // ini 文件的文件名?
);?

這個 api 可以讀出整個 section 的內容,當你不知道 section 中有哪些 key 的時候,可以使用這個 api 將整個 section 讀出后再處理。?


GetPrivateProfileSectionNames - 從 ini 文件中獲得 Section 的名稱,它的原形是:?

GetPrivateProfileSectionNames(?
LPTSTR lpszReturnBuffer, // 返回數據的緩沖區地址?
DWORD nSize // 返回數據的緩沖區長度?
LPCTSTR lpFileName // ini 文件的文件名?
);?

如果 ini 中有兩個 Section: [sec1] 和 [sec2],則返回的是 'sec1',0,'sec2',0,0 ,當你不知道 ini 中有哪些 section 的時候可以用這個 api 來獲取名稱?


WritePrivateProfileSection - 將一個整個 Section 的內容入 ini 文件的指定 Section 中,它的原形是:?

WritePrivateProfileSection(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpString // 要寫入的數據的地址?
LPCTSTR lpFileName // ini 文件的文件名?
);?


WritePrivateProfileString - 將一個 Key 值寫入 ini 文件的指定 Section 中,它的原形是:?

WritePrivateProfileString(?
LPCTSTR lpAppName, // 指向包含 Section 名稱的字符串地址?
LPCTSTR lpKeyName, // 指向包含 Key 名稱的字符串地址?
LPCTSTR lpString // 要寫的字符串地址?
LPCTSTR lpFileName // ini 文件的文件名?
);?

如果 ini 中沒有指定的 Section,API 會新建 Section,如果沒有指定的 Key 則新建一個 Key 并寫入數據,如果已經存在,則用字符串代替原來的值。當指定的 ini 也不存在的時候,API 會自動建立一個新的文件,所以使用 ini 的好處是我們不必為了保存少量的數據涉及到文件操作,就連查找文件是否存在的操作都不必要。?

使用要點:?

在我們實際使用的時候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在對自定義 ini 文件操作的時候要注意的是,如果 lpFileName 指定的文件沒有路徑的話,Api 會去 Windows 的安裝目錄去找而不會在當前目錄找,但是每次用到 ini 函數要獲取當前路徑顯然太麻煩了,這里有一個變通的辦法,你只要在 ini 文件名前面加上 .\ 就可以了,比如說要對本目錄下的 user.ini 操作,那么文件名就是 '.\user.ini' 這樣顯然比較方便。另外,當你要把一個 Key 清除的時候,可以使用把 lpString 指向一個空的字符串然后使用 WritePrivateProfileString。當你要把一個 section 的全部內容清空的時候,也不必把 key 一個個的清除,可以使用把 lpString 指向一個空的字符串然后使用 WritePrivateProfileSection。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452065.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452065.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452065.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

摩拜大數據殺熟?官方:老用戶押金的確退款延遲

近日,有媒體曝出摩拜單車一些老用戶出現押金難退現象。有的消費者點擊退款后,系統不斷奔潰;有的申請退款后,賬戶又莫名出現押金,就像未申請一樣;也有人終于提交了退款,等候數日卻遲遲不見到賬。…

Junit Test使用樣例

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 配置: 調用類: import java.util.List;import javax.annotation.Resource;import org.apache.shiro.crypto.Rand…

Django congtent types應用

contenttypes 是Django內置的一個應用,可以追蹤項目中所有app和model的對應關系,并記錄在ContentType表中。 每當我們創建了新的model并執行數據庫遷移后,ContentType表中就會自動新增一條記錄。比如我在應用app01的models.py中創建表class E…

網絡爬蟲--7.Handler處理器 和 自定義Opener

文章目錄一. 引言二. 簡單的自定義opener()三. ProxyHandler處理器(代理設置)四. Cookie1.Cookie原理2.Cookie應用五. cookiejar庫 和 HTTPCookieProcessor處理器1.案例一:獲取Cookie,并保存到CookieJar()對象中2.案例二:利用cook…

如何選擇面向對象語言

開發人員在選擇面向對象語言時,還應該著重考慮以下一些實際因素。 1. 將來能否占主導地位 為了使自己的產品在若干年后仍然具有很強的生命力,人們可能希望采用將來占主導地位的語言編程。 根據目前占有的市場份額,以及專業書刊和學術會議上所…

Unicode編碼及其實現:UTF-16、UTF-8,and more

本文主要討論Unicode的編碼與各種實現,著重討論UTF-16,UTF-8的實現規則,以及Big-endian和Little-Endian的存儲規則。 一、Unicode編碼 Unicode出現之前已經有各種編碼標準:ANSI、ISO8859-1、GB2312、GBK以及BIG-5等。Unicode試圖統…

Apache Tiles的使用 前配置

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用方法見&#xff1a; http://blog.csdn.net/jiangyu1013/article/details/53161580 1.加maven 依賴&#xff1a; <!-- 頁面布局…

day212223:線程、進程、協程

1、程序工作原理 進程的限制&#xff1a;每一個時刻只能有一個線程來工作。多進程的優點&#xff1a;同時利用多個cpu&#xff0c;能夠同時進行多個操作。缺點&#xff1a;對內存消耗比較高當進程數多于cpu數量的時候會導致不能被調用&#xff0c;進程不是越多越好&#xff0c;…

php課程 8-28 php如何繪制生成顯示圖片

php課程 8-28 php如何繪制生成顯示圖片 一、總結 一句話總結&#xff1a;gd庫輕松解決 1、php圖片操作生成的圖的兩種去向是什么&#xff1f; 一種在頁面直接輸出&#xff0c;一種存進本地磁盤 2、php操作圖片的庫有哪些&#xff1f; PHP: Image Processing and Generation - M…

代碼行技術

用代碼行技術估算軟件規模時&#xff0c;當程序較小時常用的單位是代碼行數&#xff08;LOC&#xff09;&#xff0c;當程序較大時常用的單位是千行代碼數&#xff08;KLOC&#xff09;。 代碼行技術的主要優點是&#xff0c;代碼是所有軟件開發項目都有的“產品”&#xff0c;…

網絡爬蟲--8.編碼趣聞

很久很久以前&#xff0c;有一群人&#xff0c;他們決定用8個可以開合的晶體管來組合成不同的狀態&#xff0c;以表示世界上的萬物。他們看到8個開關狀態是好的&#xff0c;于是他們把這稱為"字節"。 再后來&#xff0c;他們又做了一些可以處理這些字節的機器&#…

科技領域的一分鐘

各位果迷是否能想象在一分鐘之內&#xff0c;科技領域都會發生什么事情&#xff1f;——蘋果平均每分鐘賣出81部 iPad&#xff1b;在 iPhone 4S 發布后的第一個周末&#xff0c;每分鐘賣出925部 iPhone 4S&#xff1b;RIM每分鐘賣出103臺黑莓手機&#xff1b;Amazon每分鐘賣出1…

flavr—超級漂亮的jQuery扁平彈出對話框

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 插件描述&#xff1a;flavr是一個時尚的扁平彈出對話框為您的下一個網站。 flavr是響應設計布局&#xff0c;能夠適應任何屏幕大小。 得…

經緯度之間的距離計算

來自谷歌地圖的計算公式&#xff1a; 通過JAVA的Math類各種方法調用。實現上述公式 private static double EARTH_RADIUS 6378.137;// 單位千米/*** 角度弧度計算公式 rad:(). <br/>* * 360度2π πMath.PI* * x度 x*π/360 弧度* * author chiwei* param d* return* s…

在CentOS7阿里云服務器部署ThinkPHP5,并配置phpstrom實現同步開發(微信小程序及管理員后端)...

小程序和后端同步開發 1.服務器安裝tp5框架&#xff1a; 方法很多比如&#xff1a;github、linux命令直接手動下、composer 都可以&#xff0c;方法很多&#xff0c;百度一下&#xff0c;不再累述 2.這時你會發現怎么都訪問出現不了這個令人舒心的界面&#xff08;ok第一個坑到…

ER圖( 實體聯系圖)

E-R圖也稱實體-聯系圖(Entity Relationship Diagram)&#xff0c;提供了表示實體類型、屬性和聯系的方法&#xff0c;用來描述現實世界的概念模型。 它是描述現實世界概念結構模型的有效方法。是表示概念模型的一種方式&#xff0c;用矩形表示實體型&#xff0c;矩形框內寫明…

網絡爬蟲--9.正則表達式

文章目錄一. 正則表達式1.為什么要學正則表達式2.什么是正則表達式3.正則表達式匹配規則二. Python 的 re 模塊1.re 模塊的一般使用步驟2.compile 函數3.match 方法4.search 方法5.findall 方法6.finditer 方法7.split 方法8.sub 方法9.匹配中文10.貪婪模式與非貪婪模式1&#…

概念模型

將需求分析得到的用戶需求抽象為信息結構&#xff08;即概念模型&#xff09;的過程就是概念結構設計 概念模型的特點 &#xff08;1&#xff09;能真實、充分地反映現實世界&#xff0c;是現實世界的一個真 實模型。 &#xff08;2&#xff09;易于理解&#xff0c;從…

筆記本電池的正確使用方法

一、新買筆記本不需要激活&#xff0c;也不需要前三次的充電12小時深充深放&#xff0c;這主要是鋰電池的原理和特性決定的。電池設計有電量保護&#xff0c;不可能將電量完全用完&#xff0c;當然也不可能過度充電。 二、筆記本電池的壽命受周圍環境的影響很大&#xff0c;最好…

關于XShell 啟動虛擬機的weblogic并在本地打開oracle-weblogic 有關部署

對于沒有用過這款軟件的童鞋&#xff0c;我想必定會有幾步彎路&#xff1a; 1.新建好的虛擬機記得換成root用戶【su root】~ifconfig【eth0 inet addr】如果沒有這項請點擊右上角的電腦標識&#xff0c;鼠標左擊一下連接&#xff0c;沒有了x號就重新輸入ifconfig就有了 2.xshe…