欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++使用ZLIB庫實現(xiàn)目錄壓縮與解壓功能

 更新時間:2025年02月11日 09:43:36   作者:森明幫大于黑虎幫  
在軟件開發(fā)和數(shù)據(jù)處理中,對數(shù)據(jù)進行高效的壓縮和解壓縮是一項重要的任務,這不僅有助于減小數(shù)據(jù)在網絡傳輸和存儲中的占用空間,還能提高系統(tǒng)的性能和響應速度,本文將介紹如何使用 zlib 庫進行數(shù)據(jù)的壓縮和解壓縮,以及如何保存和讀取壓縮后的文件

C++ 使用ZLIB庫實現(xiàn)目錄壓縮與解壓

在軟件開發(fā)和數(shù)據(jù)處理中,對數(shù)據(jù)進行高效的壓縮和解壓縮是一項重要的任務。這不僅有助于減小數(shù)據(jù)在網絡傳輸和存儲中的占用空間,還能提高系統(tǒng)的性能和響應速度。本文將介紹如何使用 zlib 庫進行數(shù)據(jù)的壓縮和解壓縮,以及如何保存和讀取壓縮后的文件。 zlib 是一個開源的數(shù)據(jù)壓縮庫,旨在提供高效、輕量級的壓縮和解壓縮算法。其核心壓縮算法基于 DEFLATE,這是一種無損數(shù)據(jù)壓縮算法,通常能夠提供相當高的壓縮比。zlib 庫廣泛應用于多個領域,包括網絡通信、文件壓縮、數(shù)據(jù)庫系統(tǒng)等。

1、保存文件

使用 CreateFile 打開文件,通過 WriteFile 向文件中寫出數(shù)據(jù),最后調用 CloseHandle 關閉句柄,實現(xiàn)文件的保存。

// ConsoleApplication1.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"

#define ZLIB_WINAPI
#include <string>
#include <iostream>
#include <vector>
#include <Shlwapi.h> 
#include <zip.h>
#include <unzip.h>
#include <zlib.h>

using namespace std;

#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "zlibstat.lib")

BOOL SaveToFile(wchar_t *pszFileName, BYTE *pData, DWORD dwDataSize)
{
	wchar_t  szSaveName[MAX_PATH] = { 0 };
	lstrcpy(szSaveName, pszFileName);

	HANDLE hFile = CreateFile(szSaveName, GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
		FILE_ATTRIBUTE_ARCHIVE, NULL);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		return FALSE;
	}

	DWORD dwRet = 0;
	WriteFile(hFile, pData, dwDataSize, &dwRet, NULL);

	CloseHandle(hFile);

	return TRUE;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char szBuffer[1024] = { 0 };

	strcpy_s(szBuffer,sizeof("test__123123"), "test__123123");

	SaveToFile(L"F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.txt", (BYTE *)szBuffer, sizeof(szBuffer));

	system("pause");
	return 0;
}


這段代碼是一個簡單的C++控制臺應用程序,它定義了一個函數(shù) SaveToFile 來將數(shù)據(jù)保存到文件,并在 main 函數(shù)中測試這個功能。下面是這段代碼的中文解釋:

  • 頭文件包含部分:

這里包含了程序所需的頭文件。

stdafx.h 是預編譯頭文件,用于加速編譯過程。ZLIB_WINAPI 宏定義表明我們將在Windows API模式下使用zlib庫。其他包含的文件提供了字符串操作、輸入輸出流、向量容器和文件路徑操作的功能。zip.h、unzip.h和zlib.h是zlib庫的一部分,用于壓縮和解壓縮文件。

  • 庫鏈接指令:

#pragma comment(lib, “Shlwapi.lib”)

#pragma comment(lib, “zlibstat.lib”)

這些行指示鏈接器鏈接到 Shlwapi.lib(Shell輕量級實用工具庫)和 zlibstat.lib(zlib靜態(tài)庫)。

  • SaveToFile 函數(shù):

SaveToFile 函數(shù)接受一個文件名、一個指向數(shù)據(jù)的指針和數(shù)據(jù)的大小,然后創(chuàng)建一個文件并將數(shù)據(jù)寫入該文件。

  • _tmain 函數(shù):

_tmain 是程序的入口點。在這里,它創(chuàng)建了一個字符數(shù)組szBuffer,使用strcpy_s函數(shù)將字符串 “test 123123” 復制到szBuffer中,然后調用SaveToFile函數(shù)將這個緩沖區(qū)保存到硬盤上的一個文件中。

  • SaveToFile 函數(shù)的具體操作:

定義一個寬字符數(shù)組szSaveName用于存放將要保存的文件的路徑。

使用lstrcpy函數(shù)將傳入的文件路徑pszFileName復制到szSaveName。

調用CreateFile函數(shù)創(chuàng)建或覆蓋文件szSaveName。

在這段代碼中,調用CreateFile函數(shù)創(chuàng)建或覆蓋文件szSaveName的行為體現(xiàn)在CreateFile函數(shù)的dwCreationDisposition參數(shù)上。在這個例子中,這個參數(shù)被設置為CREATE_ALWAYS。

CREATE_ALWAYS是CreateFile函數(shù)的一個選項,它指示操作系統(tǒng),無論目標文件是否存在,都創(chuàng)建一個新文件。如果文件已經存在,使用CREATE_ALWAYS會導致現(xiàn)有文件被覆蓋。這意味著,如果szSaveName指定的文件已經存在于磁盤上,它將被新文件替換,從而體現(xiàn)了"覆蓋"的行為。

簡而言之,通過使用CREATE_ALWAYS作為dwCreationDisposition的參數(shù)值,CreateFile函數(shù)在這段代碼中不僅可以用來創(chuàng)建一個新文件,也可以用來覆蓋一個已經存在的文件。如果操作成功,舊的文件內容會被丟棄,并開始寫入新的內容;如果操作失敗,例如由于權限問題或路徑問題,函數(shù)將返回INVALID_HANDLE_VALUE。

如果目的是追加內容到一個已存在的文件,而不是覆蓋它,你可以使用CreateFile函數(shù)的另一個參數(shù)選項 OPEN_EXISTING或OPEN_ALWAYS,配合文件指針移動函數(shù)SetFilePointer和寫入函數(shù)WriteFile來實現(xiàn)。

OPEN_EXISTING: 打開文件僅當它存在。如果文件不存在,CreateFile將失敗。

OPEN_ALWAYS: 打開文件如果它存在,如果不存在則創(chuàng)建一個新文件。這與CREATE_ALWAYS不同,因為CREATE_ALWAYS會覆蓋已存在的文件,而OPEN_ALWAYS在文件已存在時不會覆蓋現(xiàn)有內容。

  • 為了追加內容,可以這樣做:

使用CreateFile函數(shù)打開(或創(chuàng)建)文件,dwCreationDisposition參數(shù)使用OPEN_ALWAYS。

調用SetFilePointer函數(shù)將文件指針移動到文件末尾。SetFilePointer的dwMoveMethod參數(shù)設置為FILE_END,lDistanceToMove設置為0,這樣文件指針就會定位到文件的末尾,準備追加內容。

使用WriteFile函數(shù)寫入新內容,寫入的內容將添加到文件的末尾,而不是覆蓋原有內容。

以下是示例代碼,展示如何修改SaveToFile函數(shù)以追加內容到文件而不是覆蓋:

BOOL AppendToFile(wchar_t *pszFileName, BYTE *pData, DWORD dwDataSize) { wchar_t szSaveName[MAX_PATH] = { 0 }; lstrcpy(szSaveName, pszFileName); // 使用OPEN_ALWAYS選項打開或創(chuàng)建文件 HANDLE hFile = CreateFile(szSaveName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } // 將文件指針移動到文件末尾 SetFilePointer(hFile, 0, NULL, FILE_END); DWORD dwRet = 0; WriteFile(hFile, pData, dwDataSize, &dwRet, NULL); CloseHandle(hFile); return TRUE; }

如果文件創(chuàng)建成功,使用WriteFile函數(shù)將傳入的數(shù)據(jù)pData寫入文件。

關閉文件句柄并返回操作結果。

  • _tmain 函數(shù)的具體操作:

定義一個緩沖區(qū)szBuffer并使用strcpy_s安全復制函數(shù)初始化這個緩沖區(qū)。

調用SaveToFile函數(shù),將szBuffer中的數(shù)據(jù)保存到F:\vs2013_code\ConsoleApplication2\Debug\1.txt。
程序暫停等待用戶操作,之后退出。

整個程序的目的是演示如何安全地將數(shù)據(jù)寫入到文件中,并在主函數(shù)中測試這個功能。程序將字符串 “test 123123” 保存到指定的文本文件中。

2、文件壓縮

compress 是 zlib 庫提供的用于數(shù)據(jù)壓縮的函數(shù),通過該函數(shù)可以將數(shù)據(jù)進行壓縮。下面是一個示例,演示了如何使用 zlib 庫進行文件壓縮。

它的原型如下:

int compress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen);
  • dest:指向存放壓縮后數(shù)據(jù)的緩沖區(qū)的指針。
  • destLen:傳入時為壓縮緩沖區(qū)的大小,傳出時為實際壓縮后數(shù)據(jù)的大小。
  • source:指向待壓縮數(shù)據(jù)的緩沖區(qū)的指針。
  • sourceLen:待壓縮數(shù)據(jù)的大小。
  • dest:指向存放壓縮后數(shù)據(jù)的緩沖區(qū)的指針。
  • destLen:傳入時為壓縮緩沖區(qū)的大小,傳出時為實際壓縮后數(shù)據(jù)的大小。
  • source:指向待壓縮數(shù)據(jù)的緩沖區(qū)的指針。
  • sourceLen:待壓縮數(shù)據(jù)的大小。

compress 函數(shù)的作用是將 source 指向的數(shù)據(jù)進行壓縮,并將結果存放在 dest 指向的緩沖區(qū)中。destLen 傳入時應該是 dest 緩沖區(qū)的大小,函數(shù)執(zhí)行后,destLen 會更新為實際壓縮后數(shù)據(jù)的大小。

函數(shù)返回值為壓縮的執(zhí)行狀態(tài),可能的返回值包括:

  • Z_OK:壓縮成功。
  • Z_MEM_ERROR:內存分配失敗。
  • Z_BUF_ERROR:壓縮輸出緩沖區(qū)不足。

這個函數(shù)實際上是使用 DEFLATE 算法進行壓縮,DEFLATE 是一種通用的壓縮算法,也是 zlib 庫的核心算法之一。壓縮后的數(shù)據(jù)可以使用` uncompress 函數(shù)進行解壓縮。

總體而言,compress函數(shù)提供了一種簡單的方式,可以在應用程序中對數(shù)據(jù)進行壓縮,適用于需要減小數(shù)據(jù)體積的場景,比如網絡傳輸或數(shù)據(jù)存儲。

// 單個文件限制大小為 100M 
#define MAX_SRC_FILE_SIZE (100*1024*1024)

/**
 * @brief 壓縮指定文件的數(shù)據(jù)
 *
 * @param pszCompressFileName 待壓縮文件的路徑
 * @param ppCompressData 保存壓縮后數(shù)據(jù)的指針
 * @param pdwCompressDataSize 傳入時為壓縮緩沖區(qū)的大小,傳出時為實際壓縮后數(shù)據(jù)的大小
 * @return 壓縮是否成功,成功返回 TRUE,否則返回 FALSE
 */
BOOL CompressData(wchar_t*pszCompressFileName, BYTE **ppCompressData, DWORD *pdwCompressDataSize)
{
  HANDLE hFile = CreateFile(pszCompressFileName, GENERIC_READ,
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_ARCHIVE, NULL);

  // 檢查文件句柄是否有效
  if (INVALID_HANDLE_VALUE == hFile)
  {
    return FALSE;
  }

  // 獲取文件大小
  DWORD dwFileSize = GetFileSize(hFile, NULL);

  // 檢查文件大小是否超過限制
  if (MAX_SRC_FILE_SIZE < dwFileSize)
  {
    CloseHandle(hFile);
    return FALSE;
  }

  DWORD dwDestDataSize = dwFileSize;

  // 分配源數(shù)據(jù)和目標數(shù)據(jù)的內存
  BYTE *pSrcData = new BYTE[dwFileSize];
  if (NULL == pSrcData)
  {
    CloseHandle(hFile);
    return FALSE;
  }

  BYTE *pDestData = new BYTE[dwDestDataSize];
  if (NULL == pDestData)
  {
    delete[] pSrcData;
    CloseHandle(hFile);
    return FALSE;
  }

  DWORD dwRet = 0;

  // 讀取源數(shù)據(jù)
  ReadFile(hFile, pSrcData, dwFileSize, &dwRet, NULL);

  // 檢查讀取是否成功
  if ((0 >= dwRet) || (dwRet != dwFileSize))
  {
    delete[] pDestData;
    delete[] pSrcData;
    CloseHandle(hFile);
    return FALSE;
  }

  int iRet = 0;

  // 壓縮數(shù)據(jù)
  do
  {
    iRet = compress(pDestData, &dwDestDataSize, pSrcData, dwFileSize);

    // 壓縮成功,退出循環(huán)
    if (0 == iRet)
    {
      break;
    }
    // 輸出緩沖區(qū)不足,增加緩沖區(qū)大小并重試
    else if (-5 == iRet)
    {
      delete[] pDestData;
      pDestData = NULL;
      dwDestDataSize = dwDestDataSize + (100 * 1024);
      pDestData = new BYTE[dwDestDataSize];

      // 分配新的目標數(shù)據(jù)內存
      if (NULL == pDestData)
      {
        delete[] pSrcData;
        CloseHandle(hFile);
        return FALSE;
      }
    }
    // 壓縮失敗,釋放內存并返回失敗
    else
    {
      delete[] pDestData;
      pDestData = NULL;
      delete[] pSrcData;
      pSrcData = NULL;
      CloseHandle(hFile);
      return FALSE;
    }
  } while (TRUE);

  // 保存壓縮后數(shù)據(jù)的指針和實際大小
  *ppCompressData = pDestData;
  *pdwCompressDataSize = dwDestDataSize;

  // 釋放源數(shù)據(jù)內存
  delete[] pSrcData;

  // 關閉文件句柄
  CloseHandle(hFile);

  // 返回壓縮成功
  return TRUE;
}

3、文件解壓縮

uncompress 函數(shù)是 zlib 庫提供的用于數(shù)據(jù)解壓縮的函數(shù),通過該函數(shù)可以將壓縮后的數(shù)據(jù)解壓縮還原。下面是一個示例,演示了如何使用 zlib 庫進行文件解壓縮。

它的原型如下:

int uncompress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen);
  • dest:指向存放解壓縮后數(shù)據(jù)的緩沖區(qū)的指針。
  • destLen:傳入時為解壓縮緩沖區(qū)的大小,傳出時為實際解壓縮后數(shù)據(jù)的大小。
  • source:指向待解壓縮數(shù)據(jù)的緩沖區(qū)的指針。
  • sourceLen:待解壓縮數(shù)據(jù)的大小。

uncompress 函數(shù)的作用是將 source 指向的數(shù)據(jù)進行解壓縮,并將結果存放在 dest 指向的緩沖區(qū)中。destLen 傳入時應該是 dest 緩沖區(qū)的大小,函數(shù)執(zhí)行后,destLen 會更新為實際解壓縮后數(shù)據(jù)的大小。

函數(shù)返回值為解壓縮的執(zhí)行狀態(tài),可能的返回值包括:

  • Z_OK:解壓縮成功。
  • Z_MEM_ERROR:內存分配失敗。
  • Z_BUF_ERROR:解壓縮輸出緩沖區(qū)不足。
  • Z_DATA_ERROR:輸入數(shù)據(jù)錯誤或損壞。

uncompress 函數(shù)實際上是使用DEFLATE算法進行解壓縮,與 compress 函數(shù)相對應。這兩個函數(shù)共同構成了 zlib 庫中的基本數(shù)據(jù)壓縮和解壓縮功能。

在實際應用中,可以使用這兩個函數(shù)來處理需要壓縮和解壓縮的數(shù)據(jù),例如在網絡通信中減小數(shù)據(jù)傳輸量或在存儲數(shù)據(jù)時減小占用空間。

/**
 * @brief 解壓指定文件的數(shù)據(jù)
 *
 * @param pszUncompressFileName 待解壓文件的路徑
 * @param ppUncompressData 保存解壓后數(shù)據(jù)的指針
 * @param pdwUncompressDataSize 傳入時為解壓緩沖區(qū)的大小,傳出時為實際解壓后數(shù)據(jù)的大小
 * @return 解壓是否成功,成功返回 TRUE,否則返回 FALSE
 */
BOOL UncompressData(wchar_t*pszUncompressFileName, BYTE **ppUncompressData, DWORD *pdwUncompressDataSize)
{
  HANDLE hFile = CreateFile(pszUncompressFileName, GENERIC_READ,
    FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
    FILE_ATTRIBUTE_ARCHIVE, NULL);

  // 檢查文件句柄是否有效
  if (INVALID_HANDLE_VALUE == hFile)
  {
    return FALSE;
  }

  // 獲取文件大小
  DWORD dwFileSize = GetFileSize(hFile, NULL);

  // 設置目標數(shù)據(jù)緩沖區(qū)大小
  DWORD dwDestDataSize = MAX_SRC_FILE_SIZE;

  // 分配源數(shù)據(jù)和目標數(shù)據(jù)的內存
  BYTE *pSrcData = new BYTE[dwFileSize];
  if (NULL == pSrcData)
  {
    CloseHandle(hFile);
    return FALSE;
  }

  BYTE *pDestData = new BYTE[dwDestDataSize];
  if (NULL == pDestData)
  {
    delete[] pSrcData;
    CloseHandle(hFile);
    return FALSE;
  }

  DWORD dwRet = 0;

  // 讀取源數(shù)據(jù)
  ReadFile(hFile, pSrcData, dwFileSize, &dwRet, NULL);

  // 檢查讀取是否成功
  if ((0 >= dwRet) || (dwRet != dwFileSize))
  {
    delete[] pDestData;
    delete[] pSrcData;
    CloseHandle(hFile);
    return FALSE;
  }

  int iRet = 0;

  // 解壓縮數(shù)據(jù)
  do
  {
    iRet = uncompress(pDestData, &dwDestDataSize, pSrcData, dwFileSize);

    // 解壓縮成功,退出循環(huán)
    if (0 == iRet)
    {
      break;
    }
    // 輸出緩沖區(qū)不足,增加緩沖區(qū)大小并重試
    else if (-5 == iRet)
    {
      delete[] pDestData;
      pDestData = NULL;
      dwDestDataSize = dwDestDataSize + (100 * 1024);
      pDestData = new BYTE[dwDestDataSize];

      // 分配新的目標數(shù)據(jù)內存
      if (NULL == pDestData)
      {
        delete[] pSrcData;
        CloseHandle(hFile);
        return FALSE;
      }
    }
    // 解壓縮失敗,釋放內存并返回失敗
    else
    {
      delete[] pDestData;
      pDestData = NULL;
      delete[] pSrcData;
      pSrcData = NULL;
      CloseHandle(hFile);
      return FALSE;
    }
  } while (TRUE);

  // 保存解壓后數(shù)據(jù)的指針和實際大小
  *ppUncompressData = pDestData;
  *pdwUncompressDataSize = dwDestDataSize;

  // 釋放源數(shù)據(jù)內存
  delete[] pSrcData;

  // 關閉文件句柄
  CloseHandle(hFile);

  // 返回解壓成功
  return TRUE;
}

4、演示示例

下面是一個包含文件壓縮和解壓縮的完整示例,展示了如何將文件進行壓縮保存,然后解壓還原。

調用CompressData壓縮文件,返回結果pCompressData存放文件內存字節(jié),結果dwCompressDataSize存放長度,并調用SaveToFile保存到本地。

int main(int argc, char* argv[])
{
	BOOL bRet = FALSE;
	BYTE *pCompressData = NULL;
	DWORD dwCompressDataSize = 0;

	// 壓縮文件
	bRet = CompressData(L"F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.txt", &pCompressData, &dwCompressDataSize);
	if (TRUE == bRet)
	{
		std::cout << "已壓縮" << std::endl;
	}

	// 保存壓縮數(shù)據(jù)為文件
	bRet = SaveToFile(L"F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.zlib", pCompressData, dwCompressDataSize);
	if (TRUE == bRet)
	{
		std::cout << "已保存到文件" << std::endl;
	}

	// 釋放內存
	delete[]pCompressData;
	pCompressData = NULL;

	system("pause");
	return 0;
}


調用UncompressData解壓縮文件,返回結果pUncompressData存放文件內存字節(jié),結果dwUncompressDataSize存放長度,并調用SaveToFile保存到本地。

int main(int argc, char* argv[])
{
  BOOL bRet = FALSE;
  BYTE *pUncompressData = NULL;
  DWORD dwUncompressDataSize = 0;

  // 解壓文件
  bRet = UncompressData("F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.zlib", &pUncompressData, &dwUncompressDataSize);
  if (TRUE == bRet)
  {
    std::cout << "已解壓" << std::endl;
  }

  // 保存解壓數(shù)據(jù)為文件
  bRet = SaveToFile("F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.txt", pUncompressData, dwUncompressDataSize);
  if (TRUE == bRet)
  {
    std::cout << "已保存到文件" << std::endl;
  }

  // 釋放內存
  delete[]pUncompressData;
  pUncompressData = NULL;

  system("pause");
  return 0;
}

編譯時可能會提示無法生成SAFESEH影響的報錯信息,如下圖所示;

結論

通過使用 zlib 庫,我們可以方便地在應用程序中實現(xiàn)數(shù)據(jù)的壓縮和解壓縮功能。這對于需要減小數(shù)據(jù)傳輸量或在存儲數(shù)據(jù)時減小占用空間的場景非常有用。在實際應用中,可以根據(jù)需要調整緩沖區(qū)大小和處理流程,以適應不同的數(shù)據(jù)處理需求。

以上就是C++使用ZLIB庫實現(xiàn)目錄壓縮與解壓功能的詳細內容,更多關于C++ ZLIB目錄壓縮與解壓的資料請關注腳本之家其它相關文章!

相關文章

  • C++之WSAAsyncSelect模型實例

    C++之WSAAsyncSelect模型實例

    這篇文章主要介紹了C++的WSAAsyncSelect模型,實例講述了socket與Windows消息機制的用法,需要的朋友可以參考下
    2014-10-10
  • Python HTTP服務搭建顯示本地文件

    Python HTTP服務搭建顯示本地文件

    這篇文章主要介紹了Python HTTP服務搭建顯示本地文件的相關資料,需要的朋友可以參考下
    2017-02-02
  • C語言中的強符號和弱符號介紹

    C語言中的強符號和弱符號介紹

    這篇文章主要介紹了C語言中的強符號和弱符號介紹,本文用多個實例來講解強符號和弱符號,需要的朋友可以參考下
    2015-03-03
  • C C++ LeetCode題解在二叉樹中增加一行示例詳解

    C C++ LeetCode題解在二叉樹中增加一行示例詳解

    這篇文章主要為大家介紹了C C++ LeetCode題解在二叉樹中增加一行示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Qt教程之QSqlQueryModel的使用詳解

    Qt教程之QSqlQueryModel的使用詳解

    QSqlQueryModel是QSqlTableModel的父類,它封裝了執(zhí)行SELECT語句從數(shù)據(jù)庫查詢數(shù)據(jù)的功能,本文將為大家介紹一下QSqlQueryModel的使用,需要的可以參考一下
    2022-11-11
  • 詳解基于Matlab的空心散點檢測

    詳解基于Matlab的空心散點檢測

    這篇文章主要介紹了如何利用Matlab實現(xiàn)空心散點檢測,文中的示例代碼講解詳細,對我們學習Matlab有一定的幫助,感興趣的可以跟隨小編了解一下
    2022-02-02
  • C++實現(xiàn)LeetCode(769.可排序的最大塊數(shù))

    C++實現(xiàn)LeetCode(769.可排序的最大塊數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(769.可排序的最大塊數(shù)),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C語言如何計算字符串長度

    C語言如何計算字符串長度

    這篇文章主要介紹了C語言如何計算字符串長度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言行優(yōu)先和列優(yōu)先的問題深入分析

    C語言行優(yōu)先和列優(yōu)先的問題深入分析

    這篇文章主要介紹了C語言行優(yōu)先和列優(yōu)先的問題深入分析的相關資料,需要的朋友可以參考下
    2017-01-01
  • C語言數(shù)組和指針,內存之間的關系

    C語言數(shù)組和指針,內存之間的關系

    這篇文章主要介紹了C語言數(shù)組和指針,內存之間的關系,首先論證一維數(shù)組和一級指針之前的關系,我們常常使用一級指針指針的方式訪問一維數(shù)組,只有對內存的理解到位才能理解它們直接的關系。需要的小伙伴可以參考一下
    2022-02-02

最新評論