📄 4-1.cpp
字号:
// fileobj项目
# include <windows.h>
# include <iostream>
// 要使用的文件名
static LPCTSTR g_szFileName = "w2kdg.Fileobj.file.data.txt" ;
// 在数据文件中读取当前数据的简单线程时将传递来的该数据增加,并写回数据文件中
static DWORD WINAPI ThreadProc (LPVOID lpParam)
{
// 将参数翻译为长整数
LONG nAdd = reinterpret_cast <LONG> (lpParam) ;
// 建立完全的指定文件名
TCHAR szFullName [MAX_PATH] ;
:: GetTempPath(MAX_PATH, szFullName) ;
:: strcat(szFullName, g_szFileName) ;
// 打开文件对象
HANDLE hFile = :: CreateFile(
szFullName, // 文件的完全名称
GENERIC_READ | GENERIC_WRITE, // 具有所有的访问权
FILE_SHARE_READ, // 允许其他线程读取
NULL, // 缺省的安全性
OPEN_ALWAYS, // 创建或打开文件
FILE_ATTRIBUTE_NORMAL, // 普通文件
NULL) ; // 无模板文件
if (hFile != INVALID_HANDLE_VALUE)
{
// 读取当前数据
LONG nValue(0) ;
DWORD dwXfer(0) ;
:: ReadFile(
hFile, // 要读取的文件
reinterpret_cast <LPVOID> (&nValue) , // 缓冲区
sizeof(nValue) , // 缓冲区容量
&dwXfer, // 读取的字节数
NULL) ; // 无重叠I/O
if (dwXfer == sizeof(nValue) )
{
// 显示当前数据
std :: cout << "read: " << nValue << std :: endl;
}
// 增加数值
nValue += nAdd;
// 写回永久存储介质
:: SetFilePointer(hFile, 0, NULL, FILE_BEGIN) ;
:: WriteFile(
hFile, // 要写入的文件
reinterpret_cast <LPCVOID> (&nValue) , // 数据
sizeof(nValue), // 缓冲区容量
&dwXfer, // 写入的字节数
NULL) ; // 无重叠I/O
if (dwXfer == sizeof(nValue) )
{
std :: cout << "write: " << nValue << std :: endl;
}
// 清除文件
:: CloseHandle(hFile) ;
hFile = INVALID_HANDLE_VALUE;
}
return(0) ;
}
void main()
{
// 创建100个线程从文件中进行读写
for (int nTotal = 100; nTotal > 0; --nTotal)
{
// 启动线程
HANDLE hThread = :: CreateThread(
NULL, // 缺省的安全性
0, // 缺省的堆栈
ThreadProc, // 线程函数
reinterpret_cast <LPVOID> (1) , // 增量
0, // 无特殊的创建标志
NULL) ; // 忽略线程id
// 等待线程完成
:: WaitForSingleObject(hThread, INFINITE) ;
// 释放指向线程的句柄
:: CloseHandle(hThread) ;
hThread = INVALID_HANDLE_VALUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -