每個使用者的profile中 都會有一個暫存的目錄 我們可以放暫存檔在裡面
暫存檔的目錄除了可以在系統登錄(registry)中找到 也可用GetTempPath()來取得
window系統也提供GetTempFileName() 來簡單的取得暫存檔名字
以下為使用範例
CString tpath;
CString fname;
GetTempPath(128,tpath.GetBuffer(128));
tpath.ReleaseBuffer();
GetTempFileName(tpath,"tmp",0,fname.GetBuffer(128));
fname.ReleaseBuffer();
// 取得檔名放在fname 之後可開啟此檔案
GetTempPath()可傳入兩個參數第一個為字串buffer大小 第二個為buffer的位置
之後暫存區的目錄便會放在tpath中
GetTempFileName() 要傳入四個參數
第一個為暫存目錄位置 可由GetTempPath()取得
第二個為三個字元的識別碼 我們可以使用自己的識別碼來分別自己的暫存檔
第三個為暫存檔編號 這裡傳入0 系統便會自動幫我們編號 並且開啟檔案
第四個為取得暫存檔名的buffer 取得的暫存檔名包括了完整路徑
要注意的是 當GetTempFileName()執行完後 暫存檔便已經開啟了
我們可以使用CFile或其他方法去開啟fname所傳回的檔案
暫存檔系統並不會自動砍掉 若存放路徑為暫存路徑 則空間不夠時系統才會自動砍掉
若不是暫存路徑的話 該檔案需要自行刪除
目前分類:程式筆記 (11)
- Jun 19 Fri 2009 13:56
暫存檔使用
- Jun 04 Thu 2009 14:01
char <-> TCHAR
Char 轉成 TCHAR的辦法
// ANSI(char) to Unicode(TCHAR)
char* temp = "測試";
int nIndex = MultiByteToWideChar(CP_ACP, 0, temp , -1, NULL, 0);
TCHAR *pUnicode = new TCHAR[nIndex + 1];
MultiByteToWideChar(CP_ACP, 0, temp , -1, pUnicode, nIndex);
// Unicode(WCHAR) to ANSI(char)
TCHAR *pUnicode = _T("你好");
int nIndex = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);
char *temp = new char[nIndex + 1];
WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, temp , nIndex, NULL, NULL);
delete pAnsi;
- May 06 Wed 2009 14:23
寫Log的API使用不定參數
●為什麼要用不定參數寫Log API ?
每次在寫 Log 之前就要宣告一個字串,再用 sprintf 或 Format 來處理,實在不方便,還要去控制字串的宣告位置、次數,多次寫Log的位置都有相同的宣告,程式碼也變得難閱讀。
不如直接將 Format 參數帶入 API,再由 Log API 來處理字串,是更好的方法。
●做法說明
// 以下為資料來源與參考資料文章(Copy & Paste)
http://blog.yam.com/csylvia/article/17973254
先講解一下什麼是不定參數,
最知名的例子就是 printf(),
你可以這樣使用
printf( "Hello." );
也可以這樣使用
printf( "Hello %s", szName );
printf( "Hello %s, you have drunk %d cups of coffee", szName, iNumber );
函式中可以只有一條字串,
也可以字串後夾帶許多參數,
這樣的函式的定義當然不可能是這樣:
printf( char* string, char* param1 );
printf( char* string, char* param1, int param2 );
printf( char* string, int param1 );
...
這樣有幾百、幾千種組合啊?!=口=|||b
這就是「不定參數」發揮的地方了。
可以看到 printf 的 prototype:
int printf(const char *format [,argument]...);
那三個點就是表示不定參數(參數的個數、型態不限定)。
用法大家非常清楚,
那假如今天想寫一個接受不定參數的函式要怎麼做?
這就要應用到 va_arg()、va_end()、va_start() 三個 macro 來完成,
根據手邊的《C/C++》內的說明如下:
va_arg():它可以讓函數後面所接的引數不必維持固定的個數。第一次呼叫時,會傳回引數列最前面的第一個引數,接下來每次呼叫會自動傳回下一個引數內容。
va_end():當使用 va_arg() 完成取得所有引數內容後呼叫此 macro,通常是為了執行 return 動作。
va_start():在使用 va_arg() 前必須先呼叫此 macro,如此才能順利找到「不定引數列」的最前面內容。
此外還有幾個相關函式:
vfprintf():將 argument list 的內容輸出到資料流。
vprintf():將 argument list 的值寫到標準輸出(standard output)。
vsprintf():將 argument list 的值輸出到字串緩衝區(string buffer)。
--------------------------------------------------------------------------------------------------
/*
NAME:
WriteLog(LPCTSTR sFormat, ...)
PARAMETER:
sFormat : 傳入的 Format 字串
... : Format 字串的參數
RETURN:
COMMENT:
*/
void CTekKLine::WriteLog(LPCTSTR sFormat, ...)
{
va_list pArgList;
TCHAR sBuffer[2048];
FILE *pFile;
CString sPath;
CString sTemp;
CTime tNow = CTime::GetCurrentTime();
// 取出傳入的 Format
va_start(pArgList, sFormat);
_vsnwprintf(sBuffer, sizeof(sBuffer) / sizeof(TCHAR), sFormat, pArgList);
va_end(pArgList);
// 建立資料夾
sPath = _T(".\\log");
CreateDirectory(sPath, NULL);
// 組成路徑
sTemp.Format(_T("%s\\kline.log"), sPath);
pFile = _tfopen(sTemp, _T("a+t"));
// 寫入檔案
sTemp.Format(_T("[%04d%02d%02d %02d:%02d:%02d] %s\n"),
tNow.GetYear(), tNow.GetMonth(), tNow.GetDay(), tNow.GetHour(), tNow.GetMinute(), tNow.GetSecond(),
sBuffer);
_fputts(sTemp, pFile);
fclose(pFile);
}
- May 06 Wed 2009 14:09
C/C++中的volatile使用時機?
C/C++ 的volatile
C/C++中的volatile使用時機?
.不知各位對volatile(揮發性的)這個字陌不陌生? 我相信大家在一些程式或多或少都看
過這個字眼, 但是究竟要在何種場合用它呢?
.當然一定是有需要, C/C++才會有這個保留字, 否則只是增加programmer的困擾而已
.有2兩個場合(I/O & multithread program), 供各位參考!
.請大家check自己的程式中(尤其是第2個場合), 若有的話請記得加上volatile
1. I/O, 假設有一程式片斷如下
U8 *pPort;
U8 i, j, k;
pPort = (U8 *)0x800000;
i = *pPort;
j = *pPort;
k = *pPort;
以上的i, j, k很有可能被compiler最佳化而導致產生
i = j = k = *pPort;
的code, 也就是說只從pPort讀取一次, 而產生 i = j = k 的結果, 但是原本的程式的目
的是要從同一個I/O port讀取3次的值給不同的變數, i, j, k的值很可能不同(例如從此
I/O port 讀取溫度), 因此i = j = k的結果不是我們所要的
怎麼辦 => 用volatile, 將
U8 *pPort;
改為
volatile U8 *pPort;
告訴compiler, pPort變數具有揮發性的特性, 所以與它有關的程式碼請不要作最佳化動作. 因而
i = *pPort;
j = *pPort;
k = *pPort;
此三列程式所產生的code, 會真正地從pPort讀取三次, 從而產生正確的結果
2. Global variables in Multithread program
=> 這是在撰寫multithread program時最容易被忽略的一部份
=> 此原因所造成的bug通常相當難解決(因為不穩定)
假設有以下程式片斷, thread 1 & thread 2共用一個global var: gData
thread 1: thread 2:
... ....
int gData; extern int gData;
while (1) int i, j, k;
{
.... for (i = 0; i < 1000; i++)
gData = rand(); {
..... /* A */
} j = gData;
....
.... }
在thread 2的for loop中, 聰明的compiler看到gData的值, 每次都重新從memory load到register,
實在沒效率, 因此會產生如下的code(注意,tmp也可以更進一步的用register取代):
tmp = gData;
for (i = 0; i < 1000; i++
{
/* A */
j = tmp;
....
}
也就是gData只讀取一次, 這下子問題來了, 說明如下:
.thread 2在執行for loop到j = gData的前一列(A)的時候(假設此時gData=tmp=5), 被切換到thread 1執行
.在thread 1的while loop中透過gData = rand(), 對gData做了修改(假設改為1), 再切換回thread 2執行
.繼續執行 j = gData, 產生j = 5的結果
.但是正確的結果應該是 j = 1
怎麼辦 => 也是用volatile,
在thread 1中, 將
int gData;
改為
volatile int gData;
在thread 2中, 將
extern int gData;
改為
extern volatile int gData;
- Apr 13 Mon 2009 14:46
Windows 開機過程
- Apr 07 Tue 2009 16:09
何謂callback function?
簡單的說,如果你使用了某個function,那麼你就是call了一個function。如果系統或是函式是要求你給一個function pointer,這個function pointer指到一個實際的函式(多半這個函式是你自己寫的)。然後它會在適當的時間呼叫此function,則此function就是所謂的 callback function。因為這個function是被callback了。
- Apr 07 Tue 2009 11:32
SQLite 相關資源
在VC++上的使用方法:
1.下載http://www.sqlite.org/sqlitedll-3_6_12.zip
2.壓縮檔內有sqlite3.dll和sqlite3.def,在命命列下利用LIB生成用於連結(LINK)的lib文件:sqlite3.lib和sqlite3.exp
PATH = D:\Program Files\Microsoft Visual Studio 9.0\VC\bin;%PATH%
PATH = D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;%PATH%
LIB /DEF:sqlite3.def /machine:IX86
3.下載http://www.sqlite.org/sqlite-source-3_6_12.zip
4.從source code裡得到sqlite3.h
wrapper的使用:
1..CppSQLite3
2. CppSQLite3U (unicode版本)
可以查閱更改sqlite DB的軟體: SQLite Administrator
- Apr 07 Tue 2009 11:13
[MFC]WinProc與PreTranslateMessage的區別
MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()处理,若其返回FALSE则再交给TranslateMessage和 DispatchMessage处理(进入WindowProc);
如果用SendMessage, 则消息直接交到WindowProc处理,所以GetMessage不会取得SendMessage的消息,当然PreTranslateMessage也就不会被调用。
如果用PostMessage,则消息进入消息队列,由GetMessage取得,PreTranslateMessage就有机会进行处理。
- Mar 20 Fri 2009 11:38
[转]sqlite常见问题
(1) 如何建立自动增长字段?
简短回答:声明为 INTEGER PRIMARY KEY 的列将会自动增长。
长一点的答案: 如果你声明表的一列为 INTEGER PRIMARY KEY,那么, 每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数,如果表是空的, 将会是1。 (如果是最大可能的主键 9223372036854775807,那个,将键值将是随机未使用的数。) 如,有下列表:
CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
);
在该表上,下列语句
INSERT INTO t1 VALUES(NULL,123);
在逻辑上等价于:
INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
有一个新的API叫做 sqlite3_last_insert_rowid(), 它将返回最近插入的整数值。
注意该整数会比表中该列上的插入之前的最大值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。如果最大可能的整数值在数据表中曾经存在过,INSERT将会失败, 并返回SQLITE_FULL错误代码。
--------------------------------------------------------------------------------
(2)SQLite3支持何种数据类型?
NULL
INTEGER
REAL
TEXT
BLOB
但实际上,sqlite3也接受如下的数据类型:
smallint 16 位元的整数。
interger 32 位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值 ,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。 这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000。
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
参见 http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------
(3)SQLite允许向一个integer型字段中插入字符串!
这是一个特性,而不是一个bug。SQLite不强制数据类型约束。 任何数据都可以插入任何列。你可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。 在 CREATE TABLE 中所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外: 标志为INTEGER PRIMARY KEY的列只能存储64位整数,当向这种列中插数据除整数以外的数据时,将会产生错误。
但SQLite确实使用声明的列类型来指示你所期望的格式。所以,例如你向一个整型列中插入字符串时,SQLite会试图将该字符串转换成一个整数。 如果可以转换,它将插入该整数;否则,将插入字符串。这种特性有时被称为 类型或列亲和性(type or column affinity).
--------------------------------------------------------------------------------
(4)为什么SQLite不允许在同一个表不同的两行上使用0和0.0作主键?
主键必须是数值类型,将主键改为TEXT型将不起作用。
每一行必须有一个唯一的主键。对于一个数值型列, SQLite认为 '0' 和 '0.0' 是相同的, 因为他们在作为整数比较时是相等的(参见上一问题)。 所以,这样值就不唯一了。
--------------------------------------------------------------------------------
(5)多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗?
多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT 操作,但在任一时刻,只能有一个进程对数据库进行更改。
SQLite 使用读、写锁控制对数据库的访问。(在Win95/98/ME等不支持读、 写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意:如果数据库文件存放于一个NFS文件系统上,这种锁机制可能不能正常工作。 这是因为 fcntl() 文件锁在很多NFS上没有正确的实现。在可能有多个进程同时访问数据库的时候,应该避免将数据库文件放到NFS上。 在Windows上,Microsoft的文档中说:如果使用 FAT 文件系统而没有运行 share.exe 守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络文件,文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。
我们意识到,没有其它嵌入式的 SQL 数据库引擎能象 SQLite 这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库,同时读一个数据库。当有任何进程想要写时,它必须在更新过程中锁住数据库文件。 但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。
但是,Client/Server数据库引擎(如 PostgreSQL, MySQL, 或 Oracle) 通常支持更高级别的并发,并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的, 因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server 结构的数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。
当SQLite试图访问一个被其它进程锁住的文件时,缺省的行为是返回 SQLITE_BUSY。 可以在C代码中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函数调整这一行为。
---------------------------------------------------------------------------
(6)SQLite线程安全吗?
线程是魔鬼(Threads are evil)。 避免使用它们。
SQLite 是线程安全的。由于很多用户会忽略我们在上一段中给出的建议, 我们做出了这种让步。但是,为了达到线程安全,SQLite在编译时必须将 SQLITE_THREADSAFE 预处理宏置为1。在Windows和Linux上, 已编译的好的二进制发行版中都是这样设置的。如果不确定你所使用的库是否是线程安全的,可以调用 sqlite3_threadsafe() 接口找出。
在 3.3.1 版本之前,一个 sqlite3 结构只能被用于调用 sqlite3_open 创建的同一线程。你不能在一个线程中打开数据库,然后将数据库句柄传递给另外一个进程使用。 这主要是由于在好多通用的线程实现(如RedHat9)中的限制引起的(是Bug吗?)。特别的,在有问题的系统上,一个进程创建的 fcntl() 锁无法被其它线程清除或修改。 所以,由于 SQLite 大量使用 fcntl() 锁做并发控制, 如果你在不同的线程间移动数据库连接,就可能会出现严重的问题。
在3.3.1版本上,关于在线程间移动数据库连接的限制变得宽松了。 在它及以后的版本中,只要连接没有持有 fcntl() 锁,在线程间移动句柄是安全的。 如果没有未决的事务,并且所有的语句都已执行完毕, 你就可以安全的假定不再持有任何锁。
在UNIX中,在执行 fork() 系统调用时不应携带已打开的数据库进入子进程。 那样做将会有问题。
--------------------------------------------------------------------------------
(7)在SQLite数据库中如何列出所有的表和索引?
如果你运行 sqlite3 命令行来访问你的数据库,可以键入 “.tables”来获得所有表的列表。或者,你可以输入 “.schema” 来看整个数据库模式,包括所有的表的索引。 输入这些命令,后面跟一个LIKE模式匹配可以限制显示的表。
在一个 C/C++ 程序中(或者脚本语言使用 Tcl/Ruby/Perl/Python 等) 你可以在一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有 表的索引。每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表,它定义数据库的模式。 SQLITE_MASTER 表看起来如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
对于表来说,type 字段永远是 'table',name 字段永远是表的名字。所以,要获得数据库中所有表的列表, 使用下列SELECT语句:
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
对于索引,type 等于 'index', name 则是索引的名字,tbl_name 是该索引所属的表的名字。 不管是表还是索引,sql 字段是原先用 CREATE TABLE 或 CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),sql字段为NULL。
SQLITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。 它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自动更新。
临时表不会出现在 SQLITE_MASTER 表中。临时表及其索引和触发器存放在另外一个叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER 跟 SQLITE_MASTER 差不多,但它只是对于创建那些临时表的应用可见。如果要获得所有表的列表, 不管是永久的还是临时的,可以使用类似下面的命令:
SELECT name FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name
--------------------------------------------------------------------------------
(8) SQLite数据库有已知的大小限制吗?
在 Windows 和 Unix 下,版本 2.7.4的 SQLite 可以达到 2的41次方字节 (2T 字节)。老版本的为 2的31 次方字节(2G 字节)。
SQLite 版本 2.8 限制一个记录的容量为 1M。SQLite 版本 3.0 则对单个记录容量没有限制。
表名、索引表名、视图名、触发器名和字段名没有长度限制。但 SQL 函数的名称 (由 sqlite3_create_function() API 函数创建) 不得超过 255 个字符。
对有关SQLite限制的详细讨论,见 limits.html 。
--------------------------------------------------------------------------------
(9) 在SQLite中,VARCHAR字段最长是多少?
SQLite 不强制 VARCHAR 的长度。 你可以在 SQLITE 中声明一个 VARCHAR(10),SQLite还是可以很高兴地允许你放入500个字符。 并且这500个字符是原封不动的,它永远不会被截断。
--------------------------------------------------------------------------------
(10) SQLite支持二进制大对象吗?
SQLite 3.0 及以后版本允许你在任何列中存储 BLOB 数据。 即使该列被声明为其它类型也可以。
--------------------------------------------------------------------------------
(11) 在SQLite中,如何在一个表上添加或删除一列?
SQLite 有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列,可更改表的名称。 如果需要对表结构做更复杂的改变,则必须重新建表。 重建时可以先将已存在的数据放到一个临时表中,删除原表, 创建新表,然后将数据从临时表中复制回来。
如,假设有一个 t1 表,其中有 "a", "b", "c" 三列, 如果要删除列 c ,以下过程描述如何做:
BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
--------------------------------------------------------------------------------
(12) 我在数据库中删除了很多数据,但数据库文件没有变小,是Bug吗?
不是。当你从SQLite数据库中删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。 当你下次插入数据时,这部分空间可以重用。磁盘空间不会丢失, 但也不会返还给操作系统。
如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头重新组织数据库。这将会使用数据库有一个空的“自由链表”, 数据库文件也会最小。但要注意的是,VACUUM 的执行会需要一些时间(在SQLite开发时,在Linux上,大约每M字节需要半秒种),并且, 执行过程中需要原数据库文件至多两倍的临时磁盘空间。
对于 SQLite 3.1版本,一个 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打开。
--------------------------------------------------------------------------------
(13) 我可以在商业产品中使用SQLite而不需支付许可费用吗?
是的。SQLite 在 public domain。 对代码的任何部分没有任何所有权声明。你可以使用它做任何事。
--------------------------------------------------------------------------------
(14) 如何在字符串中使用单引号(')?
SQL 标准规定,在字符串中,单引号需要使用逃逸字符,即在一行中使用两个单引号。在这方面 SQL 用起来类似 Pascal 语言。 SQLite 尊循标准。如:
INSERT INTO xyz VALUES('5 O''clock');
--------------------------------------------------------------------------------
(15) SQLITE_SCHEMA error是什么错误?为什么会出现该错误?
当一个准备好的(prepared)SQL语句不再有效或者无法执行时, 将返回一个 SQLITE_SCHEMA 错误。发生该错误时,SQL语句必须使用 sqlite3_prepare() API来重新编译. 在 SQLite 3 中, 一个 SQLITE_SCHEMA 错误只会发生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 执行 SQL 时。而不会发生在使用 sqlite3_exec()时。 在版本2中不是这样。
准备好的语句失效的最通常原因是:在语句准备好后, 数据库的模式又被修改了。另外的原因会发生在:
数据库离线:DETACHed.
数据库被 VACUUMed
一个用户存储过程定义被删除或改变。
一个 collation 序列定义被删除或改变。
认证函数被改变。
在所有情况下,解决方法是重新编译并执行该SQL语句。 因为一个已准备好的语句可以由于其它进程改变数据库模式而失效, 所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代码都应准备处理 SQLITE_SCHEMA 错误。下面给出一个例子:
int rc;
sqlite3_stmt *pStmt;
char zSql[] = "SELECT .....";
do {
/* Compile the statement from SQL. Assume success. */
sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);
while( SQLITE_ROW==sqlite3_step(pStmt) ){
/* Do something with the row of available data */
}
/* Finalize the statement. If an SQLITE_SCHEMA error has
** occured, then the above call to sqlite3_step() will have
** returned SQLITE_ERROR. sqlite3_finalize() will return
** SQLITE_SCHEMA. In this case the loop will execute again.
*/
rc = sqlite3_finalize(pStmt);
} while( rc==SQLITE_SCHEMA );
--------------------------------------------------------------------------------
(16) 为什么 ROUND(9.95,1) 返回 9.9 而不是 10.0? 9.95不应该圆整 (四舍五入)吗?
SQLite 使用二进制算术,在二进制中, 无法用有限的二进制位数表示 9.95 。使用 64-bit IEEE 浮点 (SQLite就是使用这个)最接近 9.95 的二进制表示是 9.949999999999999289457264239899814128875732421875。所在,当你输入 9.95 时,SQLite实际上以为是上面的数字, 在四舍五入时会舍去。
这种问题在使用二进制浮点数的任何时候都会出现。 通常的规则是记住很多有限的十进制小数都没有一个对应的二进制表示。 所以,它们只能使用最接近的二进制数。它们通常非常接近, 但也会有些微小的不同,有些时候也会导致你所期望的不同的结果。
- Mar 04 Wed 2009 17:33
MSXML DOM 與 CTreeCtrl 互相轉換
//------------------------------------------
bool RssTreeView::LoadXmlToTree(LPCWSTR xmlFileName)
{
if(PathFileExists(xmlFileName) == TRUE)
{
if ( SUCCEEDED(CoInitialize(NULL)) )
{
MSXML2::IXMLDOMDocument *pDoc;
if ( SUCCEEDED (CoCreateInstance(MSXML2::CLSID_DOMDocument,
NULL,
CLSCTX_INPROC_SERVER,
MSXML2::IID_IXMLDOMDocument,
reinterpret_cast<void**>(&pDoc))))
{
//
// Tell the "doc" that we're not going to load asynchronously.
//
if ( SUCCEEDED(pDoc->put_async(VARIANT_FALSE)) )
{
CComVariant vFile(RssDefaultNewsPath);
VARIANT_BOOL vBool;
pDoc->load(vFile,&vBool);
if ( vBool == VARIANT_TRUE )
{
MSXML2::IXMLDOMNodePtr pRootNode;
pDoc->selectSingleNode(_T("root"), &pRootNode); //取得根節點
if(pRootNode == NULL)
return false;
BSTR sRoot;
pRootNode->get_nodeName(&sRoot);
HTREEITEM root = GetTreeCtrl().InsertItem(sRoot, GetTreeCtrl().GetRootItem()); //加入根節點
XmlNodeToTreeNode(root, pRootNode);
pRootNode = NULL;
}
else
ManageDB::CheckLoad(pDoc);
}
pDoc->Release();
pDoc = NULL;
}
CoUninitialize();
}
return true;
}
else
return false;
}
void RssTreeView::XmlNodeToTreeNode(HTREEITEM parentItem, MSXML2::IXMLDOMNodePtr pXmlNode)
{
BSTR nodeType;
MSXML2::IXMLDOMNodeListPtr pXMLNodeList;
long count;
BSTR sNode;
pXmlNode->get_nodeTypeString(&nodeType);
if(!wcscmp(nodeType, _T("text"))) //NODE類型涵義請查MSDN
return;
pXmlNode->get_childNodes(&pXMLNodeList);
pXMLNodeList->get_length(&count); //子節點個數
if(count==0)
{
//沒有子節點,則設置父節點名
pXmlNode->get_nodeName(&sNode);
GetTreeCtrl().SetItemText(parentItem, sNode);
return;
}
for(int i=0; i<count; i++)
{
MSXML2::IXMLDOMNodePtr childNode;
pXMLNodeList->get_item(i, &childNode);
HTREEITEM subItem;
childNode->get_nodeTypeString(&nodeType);
if(!wcscmp(nodeType, _T("text")))
{
//是text,加節點值
childNode->get_text(&sNode);
subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
}
else
{
//非text,加節點名
childNode->get_nodeName(&sNode);
subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
//若是沒有值的非葉子節點,就加一個空子值
VARIANT_BOOL hasChild;
childNode->hasChildNodes(&hasChild);
if(sNode && wcslen(sNode) && !hasChild)
GetTreeCtrl().InsertItem(_T(""), subItem);
}
XmlNodeToTreeNode(subItem, childNode); //遞迴子節點
}
}
bool RssTreeView::SaveTreeToXml(LPCWSTR xmlFileName)
{
CoInitialize(NULL);
MSXML2::IXMLDOMDocument2Ptr pXMLDom;
HRESULT hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
if(FAILED(hr))
{
return FALSE;
}
pXMLDom->put_async(VARIANT_FALSE); // default-true
//加入頭訊息
MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
pXMLDom->createProcessingInstruction(_T("xml"), _T("version='1.0' encoding='unicode'"), &pPI);
_variant_t vNullVal;
vNullVal.vt = VT_NULL;
MSXML2::IXMLDOMNodePtr tmpNode;
pXMLDom->insertBefore(pPI, vNullVal, &tmpNode);
HTREEITEM rootItem = GetTreeCtrl().GetRootItem();
//將樹的根加入dom
MSXML2::IXMLDOMNodePtr pRootNode;
pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT),
_bstr_t(GetTreeCtrl().GetItemText(rootItem)),
_bstr_t(_T("")),
&pRootNode);
pXMLDom->appendChild(pRootNode, &tmpNode);
TreeNodeToXmlNode(rootItem, pXMLDom, pRootNode);
pXMLDom->save(_variant_t(xmlFileName));
CoUninitialize();
return TRUE;
}
void RssTreeView::TreeNodeToXmlNode(HTREEITEM parentItem, MSXML2::IXMLDOMDocument2Ptr pXMLDom, MSXML2::IXMLDOMNodePtr pXmlNode)
{
if(!GetTreeCtrl().ItemHasChildren(parentItem))
{
return;
}
MSXML2::IXMLDOMNodePtr pChildNode;
HTREEITEM hChildItem = GetTreeCtrl().GetChildItem(parentItem);//得到parentItem下所有子節點
while (hChildItem != NULL)
{
CString szText = GetTreeCtrl().GetItemText(hChildItem);
if(!GetTreeCtrl().ItemHasChildren(hChildItem)) //子為葉子
{
MSXML2::IXMLDOMTextPtr pText;
pXMLDom->createTextNode(_bstr_t(szText), &pText);
pXmlNode->appendChild(pText, &pChildNode); //puttext
}
else //子又有子
{
pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT), _bstr_t(_bstr_t(szText)), _bstr_t(_T("")), &pChildNode);
MSXML2::IXMLDOMNodePtr tmpNode;
pXmlNode->appendChild(pChildNode, &tmpNode);
TreeNodeToXmlNode(hChildItem, pXMLDom, pChildNode); //遞迴
}
hChildItem = GetTreeCtrl().GetNextItem(hChildItem, TVGN_NEXT);
}
}
- Dec 26 Fri 2008 13:30
C++ Unicode SBCS 函數對照表
Generic | SBCS | UNICODE |
TCHAR | char | wchar_t |
_TEOF | EOF | WEOF |
_TINT | int | wint_t |
_TSCHAR | signed char | wchar_t |
_TUCHAR | unsigned char | wchar_t |
_TXCHAR | char | wchar_t |
__T(x) | x | L |
__targv | __argv | __wargv |
__tcserror | _strerror | __wcserror |
__tcserror_s | _strerror_s | __wcserror_s |
_cgetts | _cgets | _cgetws |
_cgetts_s | _cgets_s | _cgetws_s |
_cputts | _cputs | _cputws |
_fgettc | fgetc | fgetwc |
_fgettc_nolock | _fgetc_nolock | _fgetwc_nolock |
_fgettchar | _fgetchar | _fgetwchar |
_fgetts | fgets | fgetws |
_fputtc | fputc | fputwc |
_fputtc_nolock | _fputc_nolock | _fputwc_nolock |
_fputtchar | _fputchar | _fputwchar |
_fputts | fputs | fputws |
_ftprintf | fprintf | fwprintf |
_ftprintf_l | _fprintf_l | _fwprintf_l |
_ftprintf_p | _fprintf_p | _fwprintf_p |
_ftprintf_p_l | _fprintf_p_l | _fwprintf_p_l |
_ftprintf_s | fprintf_s | fwprintf_s |
_ftprintf_s_l | _fprintf_s_l | _fwprintf_s_l |
_ftscanf | fscanf | fwscanf |
_ftscanf_l | _fscanf_l | _fwscanf_l |
_ftscanf_s | fscanf_s | fwscanf_s |
_ftscanf_s_l | _fscanf_s_l | _fwscanf_s_l |
_get_tpgmptr | _get_pgmptr | _get_wpgmptr |
_gettc | getc | getwc |
_gettc_nolock | _getc_nolock | _getwc_nolock |
_gettch | _getch | _getwch |
_gettch_nolock | _getch_nolock | _getwch_nolock |
_gettchar | getchar | getwchar |
_gettchar_nolock | _getchar_nolock | _getwchar_nolock |
_gettche | _getche | _getwche |
_gettche_nolock | _getche_nolock | _getwche_nolock |
_getts | gets | _getws |
_getts_s | gets_s | _getws_s |
_i64tot | _i64toa | _i64tow |
_i64tot_s | _i64toa_s | _i64tow_s |
_istalnum | isalnum | iswalnum |
_istalnum_l | _isalnum_l | _iswalnum_l |
_istalpha | isalpha | iswalpha |
_istalpha_l | _isalpha_l | _iswalpha_l |
_istascii | __isascii | iswascii |
_istcntrl | iscntrl | iswcntrl |
_istcntrl_l | _iscntrl_l | _iswcntrl_l |
_istdigit | isdigit | iswdigit |
_istdigit_l | _isdigit_l | _iswdigit_l |
_istgraph | isgraph | iswgraph |
_istgraph_l | _isgraph_l | _iswgraph_l |
_istlower | islower | iswlower |
_istlower_l | _islower_l | _iswlower_l |
_istprint | isprint | iswprint |
_istprint_l | _isprint_l | _iswprint_l |
_istpunct | ispunct | iswpunct |
_istpunct_l | _ispunct_l | _iswpunct_l |
_istspace | isspace | iswspace |
_istspace_l | _isspace_l | _iswspace_l |
_istupper | isupper | iswupper |
_istupper_l | _isupper_l | _iswupper_l |
_istxdigit | isxdigit | iswxdigit |
_istxdigit_l | _isxdigit_l | _iswxdigit_l |
_itot | _itoa | _itow |
_itot_s | _itoa_s | _itow_s |
_ltot | _ltoa | _ltow |
_ltot_s | _ltoa_s | _ltow_s |
_puttc | putc | putwc |
_puttc_nolock | _putc_nolock | _putwc_nolock |
_puttch | _putch | _putwch |
_puttch_nolock | _putch_nolock | _putwch_nolock |
_puttchar | putchar | putwchar |
_puttchar_nolock | _putchar_nolock | _putwchar_nolock |
_putts | puts | _putws |
_sctprintf | _scprintf | _scwprintf |
_sctprintf_l | _scprintf_l | _scwprintf_l |
_sctprintf_p | _scprintf_p | _scwprintf_p |
_sctprintf_p_l | _scprintf_p_l | _scwprintf_p_l |
_sntprintf | _snprintf | _snwprintf |
_sntprintf_l | _snprintf_l | _snwprintf_l |
_sntprintf_s | _snprintf_s | _snwprintf_s |
_sntprintf_s_l | _snprintf_s_l | _snwprintf_s_l |
_sntscanf | _snscanf | _snwscanf |
_sntscanf_l | _snscanf_l | _snwscanf_l |
_sntscanf_s | _snscanf_s | _snwscanf_s |
_sntscanf_s_l | _snscanf_s_l | _snwscanf_s_l |
_stprintf | sprintf | _swprintf |
_stprintf_l | _sprintf_l | __swprintf_l |
_stprintf_p | _sprintf_p | _swprintf_p |
_stprintf_p_l | _sprintf_p_l | _swprintf_p_l |
_stprintf_s | sprintf_s | swprintf_s |
_stprintf_s_l | _sprintf_s_l | _swprintf_s_l |
_stscanf | sscanf | swscanf |
_stscanf_l | _sscanf_l | _swscanf_l |
_stscanf_s | sscanf_s | swscanf_s |
_stscanf_s_l | _sscanf_s_l | _swscanf_s_l |
_tWinMain | WinMain | wWinMain |
_taccess | _access | _waccess |
_taccess_s | _access_s | _waccess_s |
_tasctime | asctime | _wasctime |
_tasctime_s | asctime_s | _wasctime_s |
_tchdir | _chdir | _wchdir |
_tchmod | _chmod | _wchmod |
_tcprintf | _cprintf | _cwprintf |
_tcprintf_l | _cprintf_l | _cwprintf_l |
_tcprintf_p | _cprintf_p | _cwprintf_p |
_tcprintf_p_l | _cprintf_p_l | _cwprintf_p_l |
_tcprintf_s | _cprintf_s | _cwprintf_s |
_tcprintf_s_l | _cprintf_s_l | _cwprintf_s_l |
_tcreat | _creat | _wcreat |
_tcscanf | _cscanf | _cwscanf |
_tcscanf_l | _cscanf_l | _cwscanf_l |
_tcscanf_s | _cscanf_s | _cwscanf_s |
_tcscanf_s_l | _cscanf_s_l | _cwscanf_s_l |
_tcscat | strcat | wcscat |
_tcscat_s | strcat_s | wcscat_s |
_tcschr | strchr | wcschr |
_tcsclen | strlen | wcslen |
_tcscmp | strcmp | wcscmp |
_tcscnlen | strnlen | wcsnlen |
_tcscoll | strcoll | wcscoll |
_tcscoll_l | _strcoll_l | _wcscoll_l |
_tcscpy | strcpy | wcscpy |
_tcscpy_s | strcpy_s | wcscpy_s |
_tcscspn | strcspn | wcscspn |
_tcsdec | _strdec | _wcsdec |
_tcsdup | _strdup | _wcsdup |
_tcsdup_dbg | _strdup_dbg | |
_tcserror | strerror | _wcserror |
_tcserror_s | strerror_s | _wcserror_s |
_tcsftime | strftime | wcsftime |
_tcsftime_l | _strftime_l | _wcsftime_l |
_tcsicmp | _stricmp | _wcsicmp |
_tcsicmp_l | _stricmp_l | _wcsicmp_l |
_tcsicoll | _stricoll | _wcsicoll |
_tcsicoll_l | _stricoll_l | _wcsicoll_l |
_tcsinc | _strinc | _wcsinc |
_tcslen | strlen | wcslen |
_tcslwr | _strlwr | _wcslwr |
_tcslwr_l | _strlwr_l | _wcslwr_l |
_tcslwr_s | _strlwr_s | _wcslwr_s |
_tcslwr_s_l | _strlwr_s_l | _wcslwr_s_l |
_tcsnbcnt | _strncnt | _wcsncnt |
_tcsncat | strncat | wcsncat |
_tcsncat_l | _strncat_l | _wcsncat_l |
_tcsncat_s | strncat_s | wcsncat_s |
_tcsncat_s_l | _strncat_s_l | _wcsncat_s_l |
_tcsnccat | strncat | wcsncat |
_tcsnccat_l | _strncat_l | _wcsncat_l |
_tcsnccat_s | strncat_s | wcsncat_s |
_tcsnccat_s_l | _strncat_s_l | _wcsncat_s_l |
_tcsnccmp | strncmp | wcsncmp |
_tcsnccnt | _strncnt | _wcsncnt |
_tcsnccoll | _strncoll | _wcsncoll |
_tcsnccoll_l | _strncoll_l | _wcsncoll_l |
_tcsnccpy | strncpy | wcsncpy |
_tcsnccpy_l | _strncpy_l | _wcsncpy_l |
_tcsnccpy_s | strncpy_s | wcsncpy_s |
_tcsnccpy_s_l | _strncpy_s_l | _wcsncpy_s_l |
_tcsncicmp | _strnicmp | _wcsnicmp |
_tcsncicmp_l | _strnicmp_l | _wcsnicmp_l |
_tcsncicoll | _strnicoll | _wcsnicoll |
_tcsncicoll_l | _strnicoll_l | _wcsnicoll_l |
_tcsncmp | strncmp | wcsncmp |
_tcsncoll | _strncoll | _wcsncoll |
_tcsncoll_l | _strncoll_l | _wcsncoll_l |
_tcsncpy | strncpy | wcsncpy |
_tcsncpy_l | _strncpy_l | _wcsncpy_l |
_tcsncpy_s | strncpy_s | wcsncpy_s |
_tcsncpy_s_l | _strncpy_s_l | _wcsncpy_s_l |
_tcsncset | _strnset | _wcsnset |
_tcsnextc | _strnextc | _wcsnextc |
_tcsnicmp | _strnicmp | _wcsnicmp |
_tcsnicmp_l | _strnicmp_l | _wcsnicmp_l |
_tcsnicoll | _strnicoll | _wcsnicoll |
_tcsnicoll_l | _strnicoll_l | _wcsnicoll_l |
_tcsninc | _strninc | _wcsninc |
_tcsnlen | strnlen | wcsnlen |
_tcsnset | _strnset | _wcsnset |
_tcsnset_l | _strnset_l | _wcsnset_l |
_tcsnset_s | _strnset_s | _wcsnset_s |
_tcsnset_s_l | _strnset_s_l | _wcsnset_s_l |
_tcspbrk | strpbrk | wcspbrk |
_tcsrchr | strrchr | wcsrchr |
_tcsrev | _strrev | _wcsrev |
_tcsset | _strset | _wcsset |
_tcsset_l | _wcsset_l | |
_tcsset_s | _strset_s | _wcsset_s |
_tcsset_s_l | _strset_s_l | _wcsset_s_l |
_tcsspn | strspn | wcsspn |
_tcsspnp | _strspnp | _wcsspnp |
_tcsstr | strstr | wcsstr |
_tcstod | strtod | wcstod |
_tcstod_l | _strtod_l | _wcstod_l |
_tcstoi64 | _strtoi64 | _wcstoi64 |
_tcstoi64_l | _strtoi64_l | _wcstoi64_l |
_tcstok | strtok | wcstok |
_tcstok_l | _strtok_l | _wcstok_l |
_tcstok_s | strtok_s | wcstok_s |
_tcstok_s_l | _strtok_s_l | _wcstok_s_l |
_tcstol | strtol | wcstol |
_tcstol_l | _strtol_l | _wcstol_l |
_tcstoui64 | _strtoui64 | _wcstoui64 |
_tcstoui64_l | _strtoui64_l | _wcstoui64_l |
_tcstoul | strtoul | wcstoul |
_tcstoul_l | _strtoul_l | _wcstoul_l |
_tcsupr | _strupr | _wcsupr |
_tcsupr_l | _strupr_l | _wcsupr_l |
_tcsupr_s | _strupr_s | _wcsupr_s |
_tcsupr_s_l | _strupr_s_l | _wcsupr_s_l |
_tcsxfrm | strxfrm | wcsxfrm |
_tcsxfrm_l | _strxfrm_l | _wcsxfrm_l |
_tctime | ctime | _wctime |
_tctime32 | _ctime32 | _wctime32 |
_tctime32_s | _ctime32_s | _wctime32_s |
_tctime64 | _ctime64 | _wctime64 |
_tctime64_s | _ctime64_s | _wctime64_s |
_tctime_s | ctime_s | _wctime_s |
_tdupenv_s | _dupenv_s | _wdupenv_s |
_tdupenv_s_dbg | _dupenv_s_dbg | _wdupenv_s_dbg |
_tenviron | _environ | _wenviron |
_texecl | _execl | _wexecl |
_texecle | _execle | _wexecle |
_texeclp | _execlp | _wexeclp |
_texeclpe | _execlpe | _wexeclpe |
_texecv | _execv | _wexecv |
_texecve | _execve | _wexecve |
_texecvp | _execvp | _wexecvp |
_texecvpe | _execvpe | _wexecvpe |
_tfdopen | _fdopen | _wfdopen |
_tfinddata32_t | _finddata32_t | _wfinddata32_t |
_tfinddata32i64_t | _finddata32i64_t | _wfinddata32i64_t |
_tfinddata64_t | __finddata64_t | _wfinddata64_t |
_tfinddata64i32_t | _finddata64i32_t | _wfinddata64i32_t |
_tfinddata_t | _finddata_t | _wfinddata_t |
_tfinddatai64_t | _finddatai64_t | _wfinddatai64_t |
_tfindfirst | _findfirst | _wfindfirst |
_tfindfirst32 | _findfirst32 | _wfindfirst32 |
_tfindfirst32i64 | _findfirst32i64 | _wfindfirst32i64 |
_tfindfirst64 | _findfirst64 | _wfindfirst64 |
_tfindfirst64i32 | _findfirst64i32 | _wfindfirst64i32 |
_tfindfirsti64 | _findfirsti64 | _wfindfirsti64 |
_tfindnext | _findnext | _wfindnext |
_tfindnext32 | _findnext32 | _wfindnext32 |
_tfindnext32i64 | _findnext32i64 | _wfindnext32i64 |
_tfindnext64 | _findnext64 | _wfindnext64 |
_tfindnext64i32 | _findnext64i32 | _wfindnext64i32 |
_tfindnexti64 | _findnexti64 | _wfindnexti64 |
_tfopen | fopen | _wfopen |
_tfopen_s | fopen_s | _wfopen_s |
_tfreopen | freopen | _wfreopen |
_tfreopen_s | freopen_s | _wfreopen_s |
_tfsopen | _fsopen | _wfsopen |
_tfullpath | _fullpath | _wfullpath |
_tfullpath_dbg | _fullpath_dbg | _wfullpath_dbg |
_tgetcwd | _getcwd | _wgetcwd |
_tgetcwd_dbg | _getcwd_dbg | _wgetcwd_dbg |
_tgetdcwd | _getdcwd | _wgetdcwd |
_tgetdcwd_dbg | _getdcwd_dbg | _wgetdcwd_dbg |
_tgetdcwd_lk_dbg | _getdcwd_lk_dbg | _wgetdcwd_lk_dbg |
_tgetdcwd_nolock | _getdcwd_nolock | _wgetdcwd_nolock |
_tgetenv | getenv | _wgetenv |
_tgetenv_s | getenv_s | _wgetenv_s |
_tmain | main | wmain |
_tmakepath | _makepath | _wmakepath |
_tmakepath_s | _makepath_s | _wmakepath_s |
_tmkdir | _mkdir | _wmkdir |
_tmktemp | _mktemp | _wmktemp |
_tmktemp_s | _mktemp_s | _wmktemp_s |
_topen | _open | _wopen |
_totlower | tolower | towlower |
_totlower_l | _tolower_l | _towlower_l |
_totupper | toupper | towupper |
_totupper_l | _toupper_l | _towupper_l |
_tperror | perror | _wperror |
_tpgmptr | _pgmptr | _wpgmptr |
_tpopen | _popen | _wpopen |
_tprintf | printf | wprintf |
_tprintf_l | _printf_l | _wprintf_l |
_tprintf_p | _printf_p | _wprintf_p |
_tprintf_p_l | _printf_p_l | _wprintf_p_l |
_tprintf_s | printf_s | wprintf_s |
_tprintf_s_l | _printf_s_l | _wprintf_s_l |
_tputenv | _putenv | _wputenv |
_tputenv_s | _putenv_s | _wputenv_s |
_tremove | remove | _wremove |
_trename | rename | _wrename |
_trmdir | _rmdir | _wrmdir |
_tscanf | scanf | wscanf |
_tscanf_l | _scanf_l | _wscanf_l |
_tscanf_s | scanf_s | wscanf_s |
_tscanf_s_l | _scanf_s_l | _wscanf_s_l |
_tsearchenv | _searchenv | _wsearchenv |
_tsearchenv_s | _searchenv_s | _wsearchenv_s |
_tsetlocale | setlocale | _wsetlocale |
_tsopen | _sopen | _wsopen |
_tsopen_s | _sopen_s | _wsopen_s |
_tspawnl | _spawnl | _wspawnl |
_tspawnle | _spawnle | _wspawnle |
_tspawnlp | _spawnlp | _wspawnlp |
_tspawnlpe | _spawnlpe | _wspawnlpe |
_tspawnv | _spawnv | _wspawnv |
_tspawnve | _spawnve | _wspawnve |
_tspawnvp | _spawnvp | _wspawnvp |
_tspawnvpe | _spawnvpe | _wspawnvpe |
_tsplitpath | _splitpath | _wsplitpath |
_tsplitpath_s | _splitpath_s | _wsplitpath_s |
_tstat | _stat | _wstat |
_tstat32 | _stat32 | _wstat32 |
_tstat32i64 | _stat32i64 | _wstat32i64 |
_tstat64 | _stat64 | _wstat64 |
_tstat64i32 | _stat64i32 | _wstat64i32 |
_tstati64 | _stati64 | _wstati64 |
_tstof | atof | _wtof |
_tstof_l | _atof_l | _wtof_l |
_tstoi | atoi | _wtoi |
_tstoi64 | _atoi64 | _wtoi64 |
_tstoi64_l | _atoi64_l | _wtoi64_l |
_tstoi_l | _atoi_l | _wtoi_l |
_tstol | atol | _wtol |
_tstol_l | _atol_l | _wtol_l |
_tstrdate | _strdate | _wstrdate |
_tstrdate_s | _strdate_s | _wstrdate_s |
_tstrtime | _strtime | _wstrtime |
_tstrtime_s | _strtime_s | _wstrtime_s |
_tsystem | system | _wsystem |
_ttempnam | _tempnam | _wtempnam |
_ttempnam_dbg | _tempnam_dbg | _wtempnam_dbg |
_ttmpnam | tmpnam | _wtmpnam |
_ttmpnam_s | tmpnam_s | _wtmpnam_s |
_ttoi | atoi | _wtoi |
_ttoi64 | _atoi64 | _wtoi64 |
_ttol | atol | _wtol |
_tunlink | _unlink | _wunlink |
_tutime | _utime | _wutime |
_tutime32 | _utime32 | _wutime32 |
_tutime64 | _utime64 | _wutime64 |
_ui64tot | _ui64toa | _ui64tow |
_ui64tot_s | _ui64toa_s | _ui64tow_s |
_ultot | _ultoa | _ultow |
_ultot_s | _ultoa_s | _ultow_s |
_ungettc | ungetc | ungetwc |
_ungettc_nolock | _ungetc_nolock | _ungetwc_nolock |
_ungettch | _ungetch | _ungetwch |
_ungettch_nolock | _ungetch_nolock | _ungetwch_nolock |
_vftprintf | vfprintf | vfwprintf |
_vftprintf_l | _vfprintf_l | _vfwprintf_l |
_vftprintf_p | _vfprintf_p | _vfwprintf_p |
_vftprintf_p_l | _vfprintf_p_l | _vfwprintf_p_l |
_vftprintf_s | vfprintf_s | vfwprintf_s |
_vftprintf_s_l | _vfprintf_s_l | _vfwprintf_s_l |
_vsctprintf | _vscprintf | _vscwprintf |
_vsctprintf_l | _vscprintf_l | _vscwprintf_l |
_vsctprintf_p | _vscprintf_p | _vscwprintf_p |
_vsctprintf_p_l | _vscprintf_p_l | _vscwprintf_p_l |
_vsntprintf | _vsnprintf | _vsnwprintf |
_vsntprintf_l | _vsnprintf_l | _vsnwprintf_l |
_vsntprintf_s | _vsnprintf_s | _vsnwprintf_s |
_vsntprintf_s_l | _vsnprintf_s_l | _vsnwprintf_s_l |
_vstprintf | vsprintf | _vswprintf |
_vstprintf_l | _vsprintf_l | _vswprintf_l |
_vstprintf_p | _vsprintf_p | _vswprintf_p |
_vstprintf_p_l | _vsprintf_p_l | _vswprintf_p_l |
_vstprintf_s | vsprintf_s | vswprintf_s |
_vstprintf_s_l | _vsprintf_s_l | _vswprintf_s_l |
_vtcprintf | _vcprintf | _vcwprintf |
_vtcprintf_l | _vcprintf_l | _vcwprintf_l |
_vtcprintf_p | _vcprintf_p | _vcwprintf_p |
_vtcprintf_p_l | _vcprintf_p_l | _vcwprintf_p_l |
_vtcprintf_s | _vcprintf_s | _vcwprintf_s |
_vtcprintf_s_l | _vcprintf_s_l | _vcwprintf_s_l |
_vtprintf | vprintf | vwprintf |
_vtprintf_l | _vprintf_l | _vwprintf_l |
_vtprintf_p | _vprintf_p | _vwprintf_p |
_vtprintf_p_l | _vprintf_p_l | _vwprintf_p_l |
_vtprintf_s | vprintf_s | vwprintf_s |
_vtprintf_s_l | _vprintf_s_l | _vwprintf_s_l |
vtprintf_s_l | _vprintf_s_l | _vwprintf_s_l |