C文件操作1

一、為什么使用文件

如果沒有文件,我們寫的程序的數據是存儲在電腦的內存中,如果程序退出,內存回收,數據就丟失 了,等再次運行程序,是看不到上次程序的數據的,如果要將數據進行持久化的保存,我們可以使用文件。

二、什么是文件

磁盤(硬盤)上的文件是文件。 但是在程序設計中,我們?般談的文件有兩種:程序文件、數據文件(從文件功能的角度來分類的)

2.1?程序文件

程序文件包括源程序文件(后綴為.c),目標文件(windows環境后綴為.obj),可執行程序(windows 環境后綴為.exe)

2.2 數據文件

文件的內容不?定是程序,而是程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文件,或者輸出內容的文件。

本章討論的是數據文件

在以前各章所處理數據的輸?輸出都是以終端為對象的,即從終端的鍵盤輸入數據,運行結果顯示到顯示器上。 其實有時候我們會把信息輸出到磁盤上,當需要的時候再從磁盤上把數據讀取到內存中使用,這里處理的就是磁盤上文件

2.3 文件名

?個文件要有?個唯?的文件標識,以便用戶識別和引用。

文件名包含3部分:文件路徑+文件名主干+文件后綴

例如: c:\code\test.txt

為了方便起見,文件標識常被稱為文件名

三、文件的打開和關閉

3.1 流和標準流

3.1.1 流

我們程序的數據需要輸出到各種外部設備,也需要從外部設備獲取數據,不同的外部設備的輸入輸出操作各不相同,為了方便程序員對各種設備進行方便的操作,我們抽象出了流(stream)的概念,我們可以想象成 流淌著字符的河

C程序針對文本件、畫面、鍵盤等的數據輸入輸出操作都是通過流操作的。?般情況下,我們要想向流里寫數據,或者從流中讀取數據,都是要打開流,然后操作

3.1.2 標準流

那為什么我們從鍵盤輸入數據,向屏幕上輸出數據,并沒有打開流呢? 那是因為C語言程序在啟動的時候,默認打開了3個流:?

? stdin - 標準輸入流(鍵盤),在大多數的環境中從鍵盤輸入,scanf函數就是從標準輸入流中讀取數據。?

? stdout - 標準輸出流(屏幕),大多數的環境中輸出至顯示器界?,printf函數就是將信息輸出到標準輸出 流中。

? stderr - 標準錯誤流(屏幕),大多數環境中輸出到顯示器界?。

這是默認打開了這三個流,我們使用scanf、printf等函數就可以直接進行輸入輸出操作的。?

stdin、stdout、stderr 三個流的類型是: FILE * ,通常稱為文件指針

C語?中,就是通過 FILE* 的文件指針來維護流的各種操作的。

3.2 文件指針

緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”

每個被使用的文件都在內存中開辟了?個相應的文件信息區,用來存放文件的相關信息(如文件的名 字,文件狀態及文件當前的位置等)。這些信息是保存在?個結構體變量中的。該結構體類型是由系統聲明的,取名FILE。

每當打開?個文件的時候,系統會根據文件的情況自動創建?個FILE結構的變量并填充其中的信息。

?般都是通過?個FILE的指針來維護這個FILE結構的變量,這樣使用起來更加方便。

下?我們可以創建?個 FILE* 的指針變量:

FILE* pf;//文件指針變量

定義pf是?個指向FILE類型數據的指針變量。可以使pf指向某個文件的文件信息區(是?個結構體變量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠間接找到與它關聯的文件。

3.3 文件的打開和關閉

文件在讀寫之前應該先打開文件,在使用結束之后應該關閉文件

在編寫程序的時候,在打開文件的同時,都會返回?個FILE*的指針變量指向該文件,也相當于建立了指針和文件的關系。

ANSI C 規定使用?fopen 函數來打開文件, fclose 來關閉文件。

它們需要包含頭文件 #include <stdio.h>

//打開文件

FILE * fopen ( const char * filename, const char * mode );

//關閉文件

int fclose ( FILE * stream );

【fclose 如果流成功關閉,則返回零值。 若關閉失敗,則返回 EOF。】

mode表示文件的打開模式,下面都是文件的打開模式:

---------------------------------------------------------------------------------------------------------------------------------

文件使用方式????????????????含義????????????????????????????????????????????????????????????????如果指定文件不存在

“r”(只讀)? ? ? ? ? ? 為了輸入數據,打開?個已經存在的文本文件? ? ? ? 出錯

“w”(只寫)? ? ? ? ? ?為了輸出數據,打開?個文本文件? ? ? ? ? ? ? ? ? ? ? ? ? 建立?個新的文件

“a”(追加)? ? ? ? ? ? 向文本文件尾添加數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 建立?個新的文件

“rb”(只讀)? ? ? ? ?? 為了輸入數據,打開?個?進制文件? ? ? ? ? ? ? ? ? ? ? 出錯

“wb”(只寫)? ? ? ? ?為了輸出數據,打開?個?進制文件? ? ? ? ? ? ? ? ? ? ? 建立?個新的文件

“ab”(追加)? ? ? ? ??向?個?進制文件尾添加數據? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?建立?個新的文件

“r+”(讀寫)? ? ? ? ? ?為了讀和寫,打開?個文本文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 出錯

“w+”(讀寫)? ? ? ? ??為了讀和寫,建議?個新的文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ?建立?個新的文件

“a+”(讀寫)? ? ? ? ? 打開?個文件,在文件尾進行讀寫? ? ? ? ? ? ? ? ? ? ? ? ? 建立?個新的文件

“rb+”(讀寫)? ? ? ? ?為了讀和寫打開?個?進制文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ?出錯

“wb+”(讀寫)????????為了讀和寫,新建?個新的?進制文件? ? ? ? ? ? ? ? ? 建立?個新的文件?

“ab+”(讀寫)? ? ? ??打開?個?進制文件,在文件尾進行讀和寫? ? ? ? ? ?建立?個新的文件??

---------------------------------------------------------------------------------------------------------------------------------

例如:當我們想讀取此文件路徑?D: \VS2022 c語言 \code \ 下的?test.txt?

要想正確讀取,我們首先是要創建文件路徑,而在創建之前,我們應該先勾選一下選項,再進行創建:

#include <stdio.h>
#include <string.h>
int main()
{FILE* pf = fopen("D:\\VS2022 c語言\\code\\test.txt","r");if(pf == NULL)//需要對返回值進行判斷{perror("fopen");return 1;}else{printf("打開文件成功\n");}//讀文件//……//關閉文件fclose(pf);pf = NULL;return 0;
}

介紹一下什么是絕對路勁和相對路徑:

絕對路徑:D:\\VS2022 c語言\\code\\test.txt

相對路勁:test.txt(指的是當前目錄下的 test.txt)

如果我們想以相對路徑的方式進行打開文件操作,那我們要先找到當前的目錄,然后將之前的文件test.txt剪切到當前目錄下:

FILE* pf = fopen("test.txt","r");

除了以上的方式,想表示當前目錄,還可以用 "./"?表示:

FILE* pf = fopen("./test.txt", "r");

"../" 表示上級目錄下的 text.txt:

將文件test.txt 剪切到上一個目錄下:

FILE* pf = fopen("../test.txt", "r");

那么 "../../"? 在文件路徑中表示 上上級目錄(即當前目錄的父目錄的父目錄)

前面我們介紹了文件的12種打開模式,而其中出錯會建立一個新的文件是什么意思呢?

現在我們拿 "w" 來進行舉例:
"w" - 只寫,建??個新的文件(覆蓋已有文件或創建新文件(僅在路徑、權限等條件允許時)
如果目標文件已存在,"w" 模式會清空文件內容(即覆蓋原有數據),并將文件指針定位到開頭,準備寫入新內容。

int main()
{FILE* pf = fopen("test.txt","w");if(pf == NULL){perror("fopen");}else{printf("打開文件成功\n");}//寫文件//……//關閉文件fclose(pf);pf = NULL;return 0;
}

我們打開文件進行寫入操作:

當程序運行起來時,"w" 模式會清空文件內容(即覆蓋原有數據),即建立一個新的文件:

四、文件的順序讀寫

4.1 順序讀寫函數介紹

這些函數都包含頭文件 #include <stdio.h>

------------------------------------------------------------------------------------

函數名? ? ? ? ? ? ? ? ? ? ? ? 功能? ? ? ? ? ? ? ? ? ? ? ? ????????適用于

fgetc? ? ? ? ? ? ? ? ? ? ? ? ? 字符串輸入函數? ? ? ? ? ? ? ?所有輸入流

fputc? ? ? ? ? ? ? ? ? ? ? ? ? 字符串輸出函數? ? ? ? ? ? ? ?所有輸出流?

fgets? ? ? ? ? ? ? ? ? ? ? ? ? 文本行輸入函數? ? ? ? ? ? ? ?所有輸入流

fputs? ? ? ? ? ? ? ? ? ? ? ? ? 文本行輸出函數? ? ? ? ? ? ? ?所有輸出流

fscanf? ? ? ? ? ? ? ? ? ? ? ? 格式化輸入函數? ? ? ? ? ? ? ?所有輸入流

fprintf? ? ? ? ? ? ? ? ? ? ? ? ?格式化輸出函數? ? ? ? ? ? ? ?所有輸出流

fread? ? ? ? ? ? ? ? ? ? ? ? ? 二進制輸入? ? ? ? ? ? ? ? ? ? ? 文本輸入流

fwrite? ? ? ? ? ? ? ? ? ? ? ? ? 二進制輸出? ? ? ? ? ? ? ? ? ? ? 文本輸出流

-----------------------------------------------------------------------------------

上?說的適用于所有輸入流?般指適用于標準輸入流和其他輸入流(如文件輸入流)所有輸出流? 般指適用于標準輸出流和其他輸出流(如文件輸出流)

4.1.1 fgetc 和 fputc

fputc

向流寫入字符

int fputc ( int character, FILE * stream );

  • 將一個字符寫入流并推進位置指示器。該字符會被寫入流的內部位置指示器所指示的位置,隨后該位置指示器會自動向前移動一位。?
  • 如果操作成功,則返回所寫入的字符。如果發生寫入錯誤,則返回 `EOF` 并設置錯誤指示器(`ferror`)。?
int main()
{FILE* pf = fopen("test.txt","w");if(pf == NULL)    {perror("fopen");return 1;}//寫文件    fputc('a',pf);fputc('b',pf);fputc('c',pf);fputc('d',pf);//關閉文件    fclose(pf);pf = NULL;return 0;
}

注意:要先運行起來后才能看到寫入文件的字符(其他的函數都一樣)

fgetc

從流中獲取字符

int fgetc ( FILE * stream );

  • 返回指定流的內部文件位置指示器當前所指向的字符。隨后,內部文件位置指示器將前進到下一個字符。如果在調用該函數時流已到達文件末尾,函數將返回 `EOF` 并為該流設置文件結束指示器(`feof`)。如果發生讀取錯誤,函數將返回 `EOF` 并為該流設置錯誤指示器(`ferror`)。
  • 如果操作成功,將返回讀取到的字符(提升為 `int` 類型的值)。返回類型為 `int` 是為了能包含特殊值 `EOF`(-1),該值表示操作失敗:如果位置指示器位于文件末尾,函數將返回 `EOF` 并設置流的文件結束指示器(`feof`)。如果發生其他讀取錯誤,函數同樣返回 `EOF`,但會設置其錯誤指示器(`ferror`)。?
int main()
{FILE* pf = fopen("test.txt","r");if(pf == NULL)    {perror("fopen");return 1;}//讀文件    int ch = fgetc(pf);printf("%c\n",ch);ch = fgetc(pf);printf("%c\n",ch);ch = fgetc(pf);printf("%c\n",ch);//關閉文件    fclose(pf);pf = NULL;return 0;
}

4.1.2 fgets 和 fputs

fputs

向流寫入字符串

int fputs ( const char * str, FILE * stream );

  • 將 `str` 所指向的 C 字符串寫入流。該函數從指定地址(`str`)開始復制,直到遇到終止空字符 `'\0'` 為止。這個終止空字符不會被復制到流中
  • 如果操作成功,將返回一個非負數值。如果發生錯誤,函數將返回 `EOF` 并設置錯誤指示器(`ferror`)。
int main()
{FILE* pf = fopen("test.txt","w");if(pf == NULL)    {perror("fopen");return 1;}//寫文件//測試寫一行數據    fputs("hello world\n",pf);fputs("haha\n",pf);//關閉文件    fclose(pf);pf = NULL;return 0;
}

fgets

從流中獲取字符串

char * fgets ( char * str, int num, FILE * stream );

  • 從流中讀取字符,并將它們作為 C 字符串存儲到 `str` 中,直到讀取了 `(num - 1)` 個字符,或者遇到換行符或文件結尾,以先發生的情況為準。換行符會使 `fgets` 停止讀取,但該函數會將其視為有效字符,并將其包含在復制到 `str` 的字符串中。在復制到 `str` 的字符之后,會自動追加一個終止空字符
  • 如果操作成功,函數將返回 `str`。如果在嘗試讀取一個字符時遇到文件末尾,則會設置文件結束指示器(`feof`)。如果在讀取任何字符之前就遇到這種情況,返回的指針將是一個空指針(并且 `str` 的內容保持不變)。如果發生讀取錯誤,將設置錯誤指示器(`ferror`),并且也會返回一個空指針(但 `str` 所指向的內容可能已經改變)。?
int main()
{FILE* pf = fopen("test.txt","r");if(pf == NULL)    {perror("fopen");return 1;}//讀文件//測試讀一行數據    char buf[20] = {0};fgets(buf,5,pf);printf("%s\n",buf);//hell - 讀4個字符,是因為第5個字符需要放'\0'fgets(buf,5,pf);printf("%s\n",buf);//關閉文件    fclose(pf);pf = NULL;return 0;
}

4.1.3 fscanf 和 fprintf

fprintf

向流寫入格式化數據

int fprintf ( FILE * stream, const char * format, ... );

  • 將 `format` 所指向的 C 字符串寫入流。如果 `format` 中包含格式說明符(以 `%` 開頭的子序列),則 `format` 后面的額外參數將被格式化,并插入到結果字符串中,以替換各自的格式說明符。在 `format` 參數之后,函數期望至少有 `format` 中指定數量的額外參數。?
  • 如果操作成功,將返回所寫入的字符總數。如果發生寫入錯誤,將設置錯誤指示器(`ferror`),并返回一個負數。
    ?

我們對比printf函數,它們的區別就是fprintf函數是向流寫入數據,而print函數只是將數據打印到屏幕上,而 …… 表示可變參數列表

printf可以這樣:printf("hehe");、printf("%s","hehe");、printf("%s %d","hehe",100);等可以在添加,那么fprintf就是多了一個FILE*類型的指針變量

struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {"zhangsan",20,95.5};FILE* pf = fopen("test.txt","w");if(pf == NULL)    {perror("fopen");return 1;}//格式化的寫入文件fprintf(pf,"%s %d %f\n",s.name,s.age,s.score);//關閉文件    fclose(pf);pf = NULL;return 0;
}

fscanf

從流中讀取格式化數據

int fscanf ( FILE * stream, const char * format, ... );

  • 從流中讀取數據,并根據 `format` 參數將數據存儲到額外參數所指向的位置。額外參數應指向已分配好的對象,這些對象的類型要與格式字符串中相應格式說明符所指定的類型一致。
  • 如果操作成功,函數將返回參數列表中成功填充的項數。由于匹配失敗、讀取錯誤或到達文件末尾,此計數可能與預期的項數相符,也可能更少(甚至為零)。如果在讀取時發生讀取錯誤或到達文件末尾,會設置相應的指示器(`feof` 或 `ferror`)。并且,如果在任何數據都未能成功讀取之前就出現上述情況,則返回 `EOF`。
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {0};FILE* pf = fopen("test.txt","r");if(pf == NULL)    {perror("fopen");return 1;}//格式化的讀取文件fscanf(pf,"%s %d %f",s.name,&(s.age),&(s.score));//打印看數據printf("%s %d %f\n",s.name,s.age,s.score);//zhang san 20 95.500000    //關閉文件    fclose(pf);pf = NULL;return 0;
}

4.1.4 通過標準輸入輸入流進行操作

前面我們知道,任何一個C語言程序運行的時候,默認打開3個流:stdin、stdout、stderr

上面這些函數適用于所有輸出、輸入流,因此,我們除了可以通過文件進行輸出、輸入操作,還可以通過stdin等標準輸入、輸出流進行操作

例如:

int main()
{int ch = fgetc(stdin);fputc(ch,stdout);return 0;
}

struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {0};fscanf(stdin,"%s %d %f",s.name,&(s.age),&(s.score));fprintf(stdout,"%s %d %f\n",s.name,s.age,s.score);return 0;
}

4.1.5 fread 和 fwrite

這兩個函數只適用于文件輸入、輸入流(二進制文件)

fwrite

向流寫入數據塊

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

  • 從 `ptr` 所指向的內存塊中,將包含 `count` 個元素(每個元素大小為 `size` 字節)的數組寫入流的當前位置。流的位置指示器會按寫入的總字節數向前移動。在函數內部,它將 `ptr` 所指向的塊視為一個由 `(size * count)` 個 `unsigned char` 類型元素組成的數組,并依次將這些元素寫入流,就好像對每個字節都調用了 `fputc` 函數一樣。?
  • 函數將返回成功寫入的元素總數。如果該數值與 `count` 參數不同,則說明寫入錯誤導致函數未能完成操作。在這種情況下,將為流設置錯誤指示器(`ferror`)。如果 `size` 或 `count` 為零,函數將返回零,且錯誤指示器保持不變。`size_t` 是一種無符號整數類型。?
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {"張三",20,95.5};FILE* pf = fopen("test.txt","wb");if(pf == NULL)    {perror("fopen");return 1;}//寫文件//測試二進制的寫函數fwrite(&s,sizeof(struct S),1,pf);   //關閉文件    fclose(pf);pf = NULL;return 0;
}

fread

從流中讀取數據塊

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

  • 從流中讀取一個包含 `count` 個元素的數組,每個元素大小為 `size` 字節,并將它們存儲到 `ptr` 指定的內存塊中。流的位置指示器會按讀取的總字節數向前移動。如果讀取成功,讀取的總字節數為 `(size * count)`。?
  • 函數將返回成功讀取的元素總數。如果該數值與 `count` 參數不同,則說明在讀取時要么發生了讀取錯誤,要么已到達文件末尾。在這兩種情況下,都會設置相應的指示器,可分別使用 `ferror` 和 `feof` 進行檢查。如果 `size` 或 `count` 為零,函數將返回零,并且流的狀態和 `ptr` 所指向的內容都將保持不變。`size_t` 是一種無符號整數類型。?
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {0};FILE* pf = fopen("test.txt","rb");if(pf == NULL)    {perror("fopen");return 1;}//讀文件//測試二進制的讀函數fread(&s,sizeof(struct S),1,pf);printf("%s %d %f\n",s.name,s.age,s.score);   //關閉文件    fclose(pf);pf = NULL;return 0;
}

4.2 對比一組函數

scanf/fscanf/sscanf

printf/fprintf/sprintf

首先認識一下sscanf 和 sprintf

sprintf

將格式化數據寫入字符串

int sprintf ( char * str, const char * format, ... );

  • 構建一個字符串,其內容與使用 `printf` 函數并傳入 `format` 參數時所打印的文本相同,但這些內容不會被打印出來,而是作為 C 字符串存儲在 `str` 所指向的緩沖區中。緩沖區的大小應足夠大,以容納整個生成的字符串;內容后面會自動追加一個終止空字符。在 `format` 參數之后,函數期望至少有 `format` 所需數量的額外參數。?
  • 如果操作成功,將返回所寫入的字符總數。此計數不包括自動追加在字符串末尾的額外空字符。如果操作失敗,將返回一個負數。?
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {"zhangsan",20,95.5};char buf[100] = {0};sprintf(buf,"%s %d %f",s.name,s.age,s.score);printf("%s\n",buf);return 0;
}

sscanf

從字符串中讀取格式化數據

int sscanf ( const char * s, const char * format, ...);

  • 從字符串 `s` 中讀取數據,并根據 `format` 參數將數據存儲到額外參數所指定的位置,就好像使用了 `scanf` 函數一樣,只不過這里是從字符串 `s` 讀取數據,而非從標準輸入(`stdin`)讀取。額外參數應指向已分配好的對象,這些對象的類型要與格式字符串中相應格式說明符所指定的類型一致。?
  • 如果操作成功,函數將返回參數列表中成功填充的項數。此計數可能與預期的項數相符,也可能在匹配失敗的情況下更少(甚至為零)。如果在成功解析任何數據之前就出現輸入失敗的情況,則返回 `EOF`。?
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = {"zhangsan",20,95.5};char buf[100] = {0};sprintf(buf,"%s %d %f",s.name,s.age,s.score);printf("%s\n",buf);//按照打印字符串struct S tmp = {0};sscanf(tmp,"%s %d %f",tmp.name,&(tmp.zge),&(tmp.score));printf("%s %d %f\n",tmp.name,tmp.age,tmp.score);//打印結構體數據return 0;
}

總結

scanf - 從鍵盤上讀取格式化的數據 stdin

printf - 把數據寫到(輸出)屏幕上 stdout

fscanf - 針對所有輸入流的格式化的輸入函數:stdin、打開的文件

fprintf - 針對所有輸出流的格式化的輸出函數:stdout、打開的文件

sscanf - 從一個字符串中,還原出一個格式化的數據

sprintf - 把格式化的數據,存放在(轉換成)一個字符串中

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

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

相關文章

Centos7.x內網環境Jenkins前端打包環境配置

Centos7.x內網環境Jenkins前端打包環境配置 參考地址&#xff1a; https://www.cnblogs.com/guangdelw/p/18763336 https://2048.csdn.net/682c1be8606a8318e857d687.html 前言&#xff1a;環境描述和目標 最近公司新接了一個項目&#xff0c;要求是&#xff1a;需要再桌面…

Hash 的工程優勢: port range 匹配

昨天和朋友聊到 “如何匹配一個 port range”&#xff0c;覺得挺有意思&#xff0c;簡單寫篇散文。 回想起十多年前&#xff0c;我移植并優化了 nf-HiPAC&#xff0c;當時還看不上 ipset hash&#xff0c;后來大約七八年前&#xff0c;我又舔 nftables&#xff0c;因為用它可直…

kafka學習筆記(三、消費者Consumer使用教程——使用實例及及核心流程源碼講解)

1.核心概念與架構 1.1.消費者與消費者組 Kafka消費者是訂閱主題&#xff08;Topic&#xff09;并拉取消息的客戶端實例&#xff0c;其核心邏輯通過KafkaConsumer類實現。消費者組&#xff08;Consumer Group&#xff09;是由多個邏輯關聯的消費者組成的集合。 核心規則 同一…

《java創世手記》---java基礎篇(下)

《Java 創世手記 - 基礎篇&#xff08;下&#xff09;》 第五章&#xff1a;契約與規范 —— 接口 (Interfaces) 與抽象類 (Abstract Classes) 造物主&#xff0c;在你日益繁榮的世界里&#xff0c;你發現僅僅依靠“繼承”來構建“物種體系”有時會遇到一些限制。比如&#x…

氣鎮閥是什么?

01、閥門介紹&#xff1a; 油封機械真空泵的壓縮室上開一小孔&#xff0c;并裝上調節閥&#xff0c;當打開閥并調節入氣量&#xff0c;轉子轉到某一位置&#xff0c;空氣就通過此孔摻入壓縮室以降低壓縮比&#xff0c;從而使大部分蒸汽不致凝結而和摻入的氣體一起被排除泵外起此…

計算機一次取數過程分析

計算機一次取數過程分析 1 取址過程 CPU由運算器和控制器組成&#xff0c;其中控制器中的程序計數器(PC)保存的是下一條指令的虛擬地址&#xff0c;經過內存管理單元(MMU)&#xff0c;將虛擬地址轉換為物理地址&#xff0c;之后交給主存地址寄存器(MAR)&#xff0c;從主存中取…

從equals思考對“正念”的認知

正念 很多人聊正念&#xff0c;每個人有自己的解說&#xff0c;我聽到最符合邏輯的一個說法&#xff1a;正念就是對抗慣性。 如果嘗試過打坐或者冥想&#xff0c;就有一個說法叫正觀&#xff0c;什么意義呢&#xff1f;就是說感受自己的呼吸&#xff0c;自己的心跳&#xff0c…

信息安全管理與評估2025山東卷

需要其他賽題解析的可聯系博主

【leetcode】02.07. 鏈表相交

鏈表相交 題目代碼1. 計算兩個鏈表的長度2. 雙指針 題目 02.07. 鏈表相交 給你兩個單鏈表的頭節點 headA 和 headB &#xff0c;請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表沒有交點&#xff0c;返回 null 。 圖示兩個鏈表在節點 c1 開始相交&#xff1a; 代碼 …

可視化與動畫:構建沉浸式Vue應用的進階實踐

在現代Web應用中&#xff0c;高性能可視化和流暢動畫已成為提升用戶體驗的核心要素。本節將深入探索Vue生態中的可視化與動畫技術&#xff0c;分享專業級解決方案與最佳實踐。 一、 Canvas高性能渲染體系 01、Konva.js流程圖引擎深度優化 <template><div class"…

?模型驅動的DeepInsight Copilot在螞蟻的技術實踐

本文整理自潘蘭天&#xff08;螞蟻數據智能團隊數據分析平臺技術專家)在DA數智大會2025上海站的演講實錄。 本文圍繞AI技術在數據分析領域的應用及DeepInsight Copilot產品展開。DeepInsight是一款螞蟻長期深耕數據分析領域的BI產品&#xff0c;本文首先介紹了DeepInsight Copi…

Express教程【003】:Express獲取查詢參數

文章目錄 3、獲取URL中攜帶的查詢參數3.1 參數形式&#xff1a;查詢字符串3.2 參數形式&#xff1a;動態參數3.3 參數形式&#xff1a;Json數據 3、獲取URL中攜帶的查詢參數 3.1 參數形式&#xff1a;查詢字符串 1??通過req.query對象&#xff0c;可以訪問到客戶端通過查詢…

在CentOS7上使用tree查看目錄樹

文章目錄 1. 利用yum安裝tree2. 利用rpm安裝tree2.1 下載tree的rpm包2.2 上傳到云主機2.3 安裝tree軟件 3. 使用tree查看目錄樹4. 實戰小結 1. 利用yum安裝tree 執行命令&#xff1a;yum -y install tree CentOS7停止更新&#xff0c;即使更新鏡像源&#xff0c;也無法正常安裝…

大規模JSON反序列化性能優化實戰:Jackson vs FastJSON深度對比與定制化改造

背景&#xff1a;500KB JSON處理的性能挑戰 在當今互聯網復雜業務場景中&#xff0c;處理500KB以上的JSON數據已成為常態。 常規反序列化方案在CPU占用&#xff08;超30%&#xff09;和內存峰值&#xff08;超原始數據3-5倍&#xff09;方面表現堪憂。 本文通過Jackson與Fas…

華為交換機S12708常用命令

以下是華為S12708交換機&#xff08;高端園區/數據中心核心交換機&#xff09;的常用運維命令&#xff0c;涵蓋基礎配置、狀態查看、故障排查等場景&#xff1a; 一、基礎配置命令 1. 系統管理 system-view # 進入系統視圖 sysname S12708-Core # 設置設備名稱 clock timez…

通過海康螢石API控制家里相機的云臺及抓圖

通過海康螢石API控制家里相機的云臺及抓圖 一、背景二、環境準備2.1 注冊開發者賬號2.2 安裝依賴庫2.3 創建`.`env`文件三、代碼片段解釋3.1 加載并使用環境變量3.2 發送HTTP請求的封裝函數3.3 獲取AccessToken3.4 分頁查詢設備列表3.5 抓拍圖片3.6 開始云臺控制3.7 控制云臺并…

XCUITest 是什么

XCUITest&#xff08;全稱 Xcode UI Test&#xff09;是蘋果官方提供的 iOS/macOS UI 自動化測試框架&#xff0c;集成在 Xcode 開發工具中&#xff0c;專門用于測試 Swift/Objective-C 開發的應用程序。 1. XCUITest 的核心特點 ? 官方支持&#xff1a;蘋果原生框架&#xf…

mapbox高階,PMTiles介紹,MBTiles、PMTiles對比,加載PMTiles文件

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??Fill面圖層樣式1.4 ??PMTiles介紹1.5…

5.0以上版本antv/g6使用心得

1. 畫布只重新渲染數據 graph.render graph.drawgraph,fitview()graph.fitCenter()setData塞入新的數據 const updateGraph (data) > {if (!graph) {console.warn("Graph is not initialized");return;}graph.clear();graph.setData(data);graph.render(); };…

4.5V~100V, 3.8A 峰值電流限, 非同步, 降壓轉換器,LA1823完美替換MP9487方案

一&#xff1a;綜述 LA1823 是一款易用的非同步&#xff0c;降壓轉換器。 該模塊集成了 500mΩ 低導通阻抗的高側 MOSFET。LA1823 使用 COT 控制技術。此種控制方式有利于快速動態響應,同時簡化了反饋環路的設計。LA1823 可以提供最大 2A 的持續負載電流。LA1823有150kHz/240kH…