【C語言】文件操作篇

目錄

  • 文件的基本概念
    • 文本文件和二進制文件的差異
  • 文件指針
    • FILE 結構體
    • 文件指針的初始化和賦值
  • 文件打開與關閉
    • 常見操作
      • 文件的打開
      • 文件的關閉
    • 常見問題
      • 打開文件時的路徑問題
      • 打開文件失敗的常見原因
      • fclose 函數的重要性
  • 文件讀寫操作
    • 常見操作
      • 字符讀寫
      • 字符串讀寫
      • 格式化讀寫
      • 二進制讀寫
    • 常見問題
      • 字符讀寫的性能考慮
      • 字符串讀寫的邊界問題
      • 格式化讀寫的精度和錯誤處理
      • 二進制讀寫的字節序問題
  • 文件指針的定位
    • 常見操作
      • fseek函數
      • ftell函數
      • rewind函數
    • 常見應用場景
      • fseek 函數的偏移量計算
      • ftell 函數的應用場景
  • 文件錯誤處理
    • 常見操作
      • ferror函數
      • feof函數
      • clearerr 函數
      • 自定義錯誤處理函數

文件的基本概念

文本文件和二進制文件的差異

  • 存儲方式
    • 文本文件:以字符編碼形式存儲,例如 ASCII 碼。每個字符(如字母、數字、標點符號)都有對應的編碼值,存儲時按編碼值的二進制形式寫入文件。例如,字符 ‘A’ 的 ASCII 碼是 65,在文件中存儲為二進制的 01000001。
    • 二進制文件:直接以數據在內存中的二進制表示形式存儲。例如,一個整數 10 在內存中以 32 位二進制 00000000 00000000 00000000 00001010 存儲,在二進制文件中也是這樣的形式。
  • 可讀性
    • 文本文件:可以用文本編輯器直接查看和編輯,因為其內容是人類可讀的字符。
    • 二進制文件:用文本編輯器打開會顯示亂碼,因為它存儲的是二進制數據,需要特定的程序來解析。
  • 應用場景
    • 文本文件:常用于存儲配置信息、日志文件、代碼文件等,方便人類查看和修改。
    • 二進制文件:常用于存儲圖像、音頻、視頻等多媒體數據,以及程序的中間數據、數據庫文件等,能更高效地存儲和處理大量數據。

文件指針

FILE 結構體

FILE 結構體是一個復雜的數據結構,包含了文件操作所需的各種信息,不同的編譯器實現可能會有所不同,但通常包含以下幾個重要成員:

  • 文件狀態信息:記錄文件的打開模式、是否出錯、是否到達文件末尾等狀態。
  • 文件緩沖區指針:指向用于文件讀寫的緩沖區,以提高文件操作的效率。
  • 文件當前位置指針:指示當前文件讀寫的位置。

文件指針的初始化和賦值

在使用文件指針之前,需要將其初始化為 NULL,以避免成為野指針。例如:

FILE *fp = NULL;

當使用 fopen 函數打開文件后,將返回的文件指針賦值給 fp,此時 fp 就指向了打開的文件。

文件打開與關閉

常見操作

文件的打開

使用fopen函數來打開一個文件,其原型如下:

FILE *fopen(const char *filename, const char *mode);
  • filename:要打開的文件的名稱,可以包含文件的路徑。
  • mode:打開文件的模式,常見的模式有:
    • "r":以只讀模式打開文本文件,文件必須存在。
    • "w":以寫入模式打開文本文件,如果文件不存在則創建,如果文件存在則清空文件內容。
    • "a":以追加模式打開文本文件,如果文件不存在則創建,寫入的數據將追加到文件末尾。
    • "rb":以只讀模式打開二進制文件,文件必須存在。
    • "wb":以寫入模式打開二進制文件,如果文件不存在則創建,如果文件存在則清空文件內容。
    • "ab":以追加模式打開二進制文件,如果文件不存在則創建,寫入的數據將追加到文件末尾。
    • "r+":以讀寫模式打開文本文件,文件必須存在。
    • "w+":以讀寫模式打開文本文件,如果文件不存在則創建,如果文件存在則清空文件內容。
    • "a+":以讀寫模式打開文本文件,如果文件不存在則創建,寫入的數據將追加到文件末尾,在讀取數據前需要將文件指針移動到文件開頭。
    • "rb+""wb+""ab+":分別對應二進制文件的讀寫模式。
  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以寫入模式打開文件fp = fopen("test.txt", "w");if (fp == NULL) {perror("文件打開失敗");return 1;}// 文件操作...fclose(fp);return 0;
}

文件的關閉

使用fclose函數來關閉一個已打開的文件,其原型如下:

int fclose(FILE *stream);

stream:要關閉的文件指針。
返回值:如果文件關閉成功,返回 0;否則返回 EOF(-1)。

常見問題

打開文件時的路徑問題

  • 絕對路徑:完整地指定了文件在文件系統中的位置,從根目錄開始。
    • 在 Windows 系統中,“C:\Users\Username\Documents\test.txt”;
    • 在 Linux 系統中,“/home/username/Documents/test.txt”。
  • 相對路徑:相對于當前工作目錄的路徑。例如,當前工作目錄是 /home/username,要打開 Documents 目錄下的 test.txt 文件,可以使用相對路徑 “Documents/test.txt”。

打開文件失敗的常見原因

  • 文件不存在:使用 “r”、“r+”、“rb”、“rb+” 等模式打開文件時,如果文件不存在,fopen 會返回 NULL。
  • 權限不足:沒有足夠的權限訪問文件或目錄,例如在 Linux 系統中,嘗試以寫入模式打開一個只讀文件。
  • 文件被占用:文件正在被其他程序使用,無法同時打開。

fclose 函數的重要性

關閉文件不僅可以釋放系統資源,還可以確保文件緩沖區中的數據被正確寫入磁盤。如果不關閉文件,可能會導致數據丟失或文件損壞。例如,在程序結束時,如果沒有調用 fclose 關閉文件,緩沖區中的數據可能不會被寫入文件。

文件讀寫操作

常見操作

字符讀寫

  • fgetc函數:從文件中讀取一個字符,其原型如下:
int fgetc(FILE *stream);

返回值:如果讀取成功,返回讀取的字符;如果到達文件末尾或發生錯誤,返回 EOF。

  • fputc函數:向文件中寫入一個字符,其原型如下:
int fputc(int c, FILE *stream);

c:要寫入的字符。
返回值:如果寫入成功,返回寫入的字符;如果發生錯誤,返回 EOF。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以寫入模式打開文件fp = fopen("test.txt", "w");if (fp == NULL) {perror("文件打開失敗");return 1;}// 寫入字符fputc('H', fp);fputc('e', fp);fputc('l', fp);fputc('l', fp);fputc('o', fp);fclose(fp);// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}// 讀取字符int ch;while ((ch = fgetc(fp)) != EOF) {putchar(ch);}fclose(fp);return 0;
}

字符串讀寫

  • fgets函數:從文件中讀取一行字符串,其原型如下:
char *fgets(char *str, int n, FILE *stream);

str:用于存儲讀取的字符串的字符數組。
n:最多讀取的字符數(包括字符串結束符 ‘\0’)。
返回值:如果讀取成功,返回 str;如果到達文件末尾或發生錯誤,返回 NULL。

  • fputs函數:向文件中寫入一個字符串,其原型如下:
int fputs(const char *str, FILE *stream);

str:要寫入的字符串。
返回值:如果寫入成功,返回非負數;如果發生錯誤,返回 EOF。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以寫入模式打開文件fp = fopen("test.txt", "w");if (fp == NULL) {perror("文件打開失敗");return 1;}// 寫入字符串fputs("Hello, World!\n", fp);fclose(fp);// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}// 讀取字符串char buffer[100];while (fgets(buffer, sizeof(buffer), fp) != NULL) {printf("%s", buffer);}fclose(fp);return 0;
}

格式化讀寫

  • fscanf函數:從文件中按照指定的格式讀取數據,其原型如下:
int fscanf(FILE *stream, const char *format, ...);

stream:要讀取的文件指針。
format:格式化字符串,指定讀取數據的格式。
返回值:成功匹配并賦值的輸入項的數量,如果到達文件末尾或發生錯誤,返回 EOF。

  • fprintf函數:向文件中按照指定的格式寫入數據,其原型如下:
int fprintf(FILE *stream, const char *format, ...);

stream:要寫入的文件指針。
format:格式化字符串,指定寫入數據的格式。
返回值:成功寫入的字符數,如果發生錯誤,返回負數。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以寫入模式打開文件fp = fopen("test.txt", "w");if (fp == NULL) {perror("文件打開失敗");return 1;}// 寫入格式化數據int num = 10;float f = 3.14;fprintf(fp, "整數: %d, 浮點數: %f\n", num, f);fclose(fp);// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}// 讀取格式化數據int read_num;float read_f;fscanf(fp, "整數: %d, 浮點數: %f", &read_num, &read_f);printf("讀取的整數: %d, 讀取的浮點數: %f\n", read_num, read_f);fclose(fp);return 0;
}

二進制讀寫

  • fread函數:從文件中讀取二進制數據,其原型如下:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr:用于存儲讀取數據的內存地址。
size:每個數據項的大小(字節數)。
nmemb:要讀取的數據項的數量。
返回值:實際讀取的數據項的數量。

  • fwrite函數:向文件中寫入二進制數據,其原型如下:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr:要寫入的數據的內存地址。
size:每個數據項的大小(字節數)。
nmemb:要寫入的數據項的數量。
返回值:實際寫入的數據項的數量。

  • 示例代碼:
#include <stdio.h>typedef struct {int id;char name[20];
} Student;int main() {FILE *fp;// 以二進制寫入模式打開文件fp = fopen("students.dat", "wb");if (fp == NULL) {perror("文件打開失敗");return 1;}// 寫入二進制數據Student s = {1, "John"};fwrite(&s, sizeof(Student), 1, fp);fclose(fp);// 以二進制只讀模式打開文件fp = fopen("students.dat", "rb");if (fp == NULL) {perror("文件打開失敗");return 1;}// 讀取二進制數據Student read_s;fread(&read_s, sizeof(Student), 1, fp);printf("ID: %d, Name: %s\n", read_s.id, read_s.name);fclose(fp);return 0;
}

常見問題

字符讀寫的性能考慮

  • 緩沖區機制:fgetc 和 fputc 函數在讀寫字符時,會使用文件緩沖區。當調用 fputc 寫入字符時,字符先被寫入緩沖區,當緩沖區滿或調用 fclose 時,緩沖區中的數據才會被寫入磁盤。同樣,調用 fgetc 讀取字符時,會先從緩沖區中讀取,如果緩沖區為空,則從磁盤讀取一批數據到緩沖區。
  • 頻繁讀寫的性能問題:由于每次調用 fgetc 或 fputc 都可能涉及到緩沖區的操作,頻繁的字符讀寫會導致性能下降。在需要大量讀寫字符時,可以考慮使用 fread 和 fwrite 函數進行批量讀寫。

字符串讀寫的邊界問題

  • fgets 函數的截斷問題:fgets 函數最多讀取 n - 1 個字符,然后在末尾添加字符串結束符 ‘\0’。如果文件中的一行字符數超過 n - 1,則會截斷該行,剩余的字符會在下一次調用 fgets 時讀取。
  • fputs 函數的換行問題:fputs 函數不會自動添加換行符,需要手動添加。例如:
fputs("Hello\n", fp);

格式化讀寫的精度和錯誤處理

  • 格式化精度:在使用 fscanf 和 fprintf 進行格式化讀寫時,需要注意格式化字符串的精度。例如,使用 %.2f 可以控制浮點數的輸出精度為兩位小數。
  • 錯誤處理:fscanf 函數在讀取數據時,如果輸入數據的格式與格式化字符串不匹配,可能會導致讀取錯誤。可以通過檢查 fscanf 的返回值來判斷是否讀取成功。

二進制讀寫的字節序問題

  • 字節序:在不同的計算機系統中,整數等多字節數據的存儲方式可能不同,分為大端字節序(Big Endian)和小端字節序(Little Endian)。大端字節序將高位字節存儲在低地址,小端字節序將低位字節存儲在低地址。
  • 跨平臺問題:在進行二進制文件讀寫時,如果涉及到跨平臺操作,需要注意字節序的問題。可以通過字節序轉換函數(如 htons、htonl、ntohs、ntohl)來確保數據的正確讀寫。

文件指針的定位

在文件操作過程中,有時需要移動文件指針的位置,以便在文件的不同位置進行讀寫操作。

常見操作

fseek函數

  • fseek函數用于將文件指針移動到指定的位置,其原型如下:
int fseek(FILE *stream, long offset, int whence);

stream:要操作的文件指針。
offset:偏移量,以字節為單位。
whence:偏移的起始位置,有三個可選值:
SEEK_SET:從文件開頭開始偏移。
SEEK_CUR:從當前文件指針位置開始偏移。
SEEK_END:從文件末尾開始偏移。
返回值:如果成功,返回 0;否則返回非零值。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}// 將文件指針移動到文件開頭偏移3個字節的位置fseek(fp, 3, SEEK_SET);int ch = fgetc(fp);printf("讀取的字符: %c\n", ch);fclose(fp);return 0;
}

ftell函數

  • ftell函數用于獲取當前文件指針的位置,其原型如下:
long ftell(FILE *stream);

stream:要操作的文件指針。
返回值:當前文件指針相對于文件開頭的偏移量(字節數),如果發生錯誤,返回 - 1。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}// 獲取當前文件指針的位置long pos = ftell(fp);printf("當前文件指針位置: %ld\n", pos);fclose(fp);return 0;
}

rewind函數

  • rewind函數用于將文件指針移動到文件開頭,其原型如下:
void rewind(FILE *stream);

stream:要操作的文件指針。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}// 移動文件指針到文件末尾fseek(fp, 0, SEEK_END);// 將文件指針移動到文件開頭rewind(fp);int ch = fgetc(fp);printf("讀取的字符: %c\n", ch);fclose(fp);return 0;
}

常見應用場景

fseek 函數的偏移量計算

  • 正數和負數偏移:fseek 函數的偏移量 offset 可以是正數或負數。正數表示向文件末尾方向偏移,負數表示向文件開頭方向偏移。例如,fseek(fp, -10, SEEK_CUR) 表示將文件指針從當前位置向文件開頭方向移動 10 個字節。
  • 偏移量的范圍:偏移量的范圍受到文件大小和系統限制的影響。在某些系統中,偏移量可能不能超過文件的最大長度。

ftell 函數的應用場景

文件大小計算:可以通過將文件指針移動到文件末尾,然后使用 ftell 函數獲取文件指針的位置,從而得到文件的大小。例如:

#include <stdio.h>int main() {FILE *fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}fseek(fp, 0, SEEK_END);long size = ftell(fp);printf("文件大小: %ld 字節\n", size);fclose(fp);return 0;
}

文件錯誤處理

常見操作

ferror函數

ferror函數用于檢查文件操作是否發生錯誤,其原型如下:

int ferror(FILE *stream);

stream:要檢查的文件指針。
返回值:如果發生錯誤,返回非零值;否則返回 0。

feof函數

feof函數用于檢查文件指針是否到達文件末尾,其原型如下:

int feof(FILE *stream);

stream:要檢查的文件指針。
返回值:如果到達文件末尾,返回非零值;否則返回 0。

  • 示例代碼:
#include <stdio.h>int main() {FILE *fp;// 以只讀模式打開文件fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {putchar(ch);}if (ferror(fp)) {printf("文件讀取發生錯誤\n");} else if (feof(fp)) {printf("到達文件末尾\n");}fclose(fp);return 0;
}

clearerr 函數

clearerr 函數用于清除文件的錯誤標志和文件結束標志,其原型如下:

void clearerr(FILE *stream);

stream:要操作的文件指針。

在發生錯誤后,可以使用 clearerr 函數清除錯誤標志,以便繼續進行文件操作。例如:

#include <stdio.h>int main() {FILE *fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {if (ferror(fp)) {printf("文件讀取發生錯誤\n");clearerr(fp); // 清除錯誤標志}putchar(ch);}fclose(fp);return 0;
}

自定義錯誤處理函數

可以編寫自定義的錯誤處理函數,以便在文件操作發生錯誤時進行統一處理。例如:

#include <stdio.h>void handle_file_error(FILE *fp, const char *message) {if (ferror(fp)) {perror(message);clearerr(fp);}
}int main() {FILE *fp = fopen("test.txt", "r");if (fp == NULL) {perror("文件打開失敗");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {handle_file_error(fp, "文件讀取錯誤");putchar(ch);}fclose(fp);return 0;
}

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

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

相關文章

【leetcode hot 100 21】合并兩個有序鏈表

解法一&#xff1a;新建一個鏈表存放有序的合并鏈表。當list1和list2至少有一個非空時&#xff0c;返回非空的&#xff1b;否則找出兩個鏈表的最小值作為新鏈表的頭&#xff0c;然后依次比較兩鏈表&#xff0c;每次都先插入小的值。 /*** Definition for singly-linked list.*…

Ubuntu 24.04.2 安裝 PostgreSQL 16 、PostGIS 3

安裝 PostgreSQL 16 apt install postgresql-16passwd postgres&#xff0c;修改 postgres 用戶密碼su postgrespsql -U postgres, 以 postgres 的身份登錄數據庫alter user postgres with password abc123;\q 退出/etc/postgresql/16/main/postgresql.conf 可修改 #listen_ad…

Spring Boot框架總結(超級詳細)

前言 本篇文章包含Springboot配置文件解釋、熱部署、自動裝配原理源碼級剖析、內嵌tomcat源碼級剖析、緩存深入、多環境部署等等&#xff0c;如果能耐心看完&#xff0c;想必會有不少收獲。 一、Spring Boot基礎應用 Spring Boot特征 概念&#xff1a; 約定優于配置&#…

postgresql14編譯安裝腳本

#!/bin/bash####################################readme################################### #先上傳postgresql源碼包&#xff0c;再配置yum源&#xff0c;然后執行腳本 #備份官方yum源配置文件&#xff1a; #cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS…

AI開發利器:miniforge3無感平替Anaconda3

相信有和我遭遇一樣的同學吧&#xff0c;之前裝了anaconda用的挺好的&#xff08;可以參考AI開發利器&#xff1a;Anaconda&#xff09;&#xff0c;但是考慮到有可能收到軟件侵權的律師函的風險&#xff0c;還是果斷找個替代品把anaconda卸載掉。miniforge就是在這樣的背景下發…

Reactor中的Flux和Mono的區別

Reactor中的Flux和Mono的區別 在Reactor框架中&#xff0c;Flux 和 Mono 是兩個核心的類型&#xff0c;分別用于處理不同的數據流場景。理解它們之間的區別是掌握響應式編程的關鍵。 1. 基本概念 Flux: 表示一個異步、非阻塞的流&#xff0c;能夠發布零個或多個元素。它適用于…

AI-NAS:當存儲遇上智能,開啟數據管理新紀元

在數據爆炸的時代&#xff0c;NAS&#xff08;網絡附加存儲&#xff09;已成為個人和企業存儲海量數據的利器。然而&#xff0c;面對日益龐大的數據量&#xff0c;傳統的NAS系統在文件管理和搜索效率上逐漸力不從心。AI-NAS應運而生&#xff0c;它將NAS與人工智能&#xff08;A…

用 Vue 3.5 TypeScript 做了一個日期選擇器(改進版)

上一篇 已經實現了一個日期選擇器&#xff0c;只不過是模態窗的形式&#xff0c;這個版本改為文本框彈出&#xff0c;點擊空白處可關閉日歷 代碼也增加了不少 <template><div><!-- 添加文本框 --><div class"date-picker-input-wrapper">&l…

【09】單片機編程核心技巧:變量賦值,從定義到存儲的底層邏輯

【09】單片機編程核心技巧&#xff1a;變量賦值&#xff0c;從定義到存儲的底層邏輯 &#x1f31f; 核心概念 單片機變量的定義與賦值是程序設計的基礎&#xff0c;其本質是通過 RAM&#xff08;隨機存儲器&#xff09; 和 ROM&#xff08;只讀存儲器&#xff09; 的協作實現…

【爬蟲】開篇詞

一、網絡爬蟲概述 二、網絡爬蟲的應用場景 三、爬蟲的痛點 四、需要掌握哪些技術&#xff1f; 在這個信息爆炸的時代&#xff0c;如何高效地獲取和處理海量數據成為一項核心技能。無論是數據分析、商業情報、學術研究&#xff0c;還是人工智能訓練&#xff0c;網絡爬蟲&…

文字轉語音chat-tts-ui

去年已經使用過chattts了&#xff0c;但是昨晚想用的時候卻記怎么打開了&#xff0c;找了一下以前的筆記 MacOS 下源碼部署chat-tts-ui 配置好 python3.9-3.11 環境,安裝git &#xff0c;執行命令 brew install libsndfile git python3.10 繼續執行 brew install ffmpeg ? …

基于SpringBoot+Vue的瑜伽課體驗課預約系統【附源碼】

基于SpringBootVue的瑜伽課體驗課預約系統 一、系統技術說明二、運行說明三、系統的演示四、系統的核心代碼演示 一、系統技術說明 框架&#xff1a;SpringbootVue 數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 數據庫工具&#xff1a;Navicat11 開發軟…

sparkTTS window 安裝

SparkTTS 的簡介 Spark-TTS是一種基于SpardAudio團隊提出的 BiCodec 構建的新系統&#xff0c;BiCodec 是一種單流語音編解碼器&#xff0c;可將語音策略性地分解為兩種互補的標記類型&#xff1a;用于語言內容的低比特率語義標記和用于說話者特定屬性的固定長度全局標記。這種…

從零開始:使用 Python 實現機器學習的基礎與實踐

文章大綱&#xff1a; 引言 機器學習的定義與應用場景。Python 在機器學習領域的優勢。本文目標&#xff1a;通過 Python 實現一個簡單的機器學習項目。 環境準備 安裝 Python 和必要的庫&#xff08;如 NumPy、Pandas、Scikit-learn&#xff09;。使用 Jupyter Notebook 或 V…

ApoorvCTF Rust語言逆向實戰

上周參加了國外的比賽&#xff0c;名稱叫&#xff1a;ApoorvCTF 看一下老外的比賽跟我們有什么不同&#xff0c;然后我根據國內比賽對比發現&#xff0c;他們考點還是很有意思的&#xff0c;反正都是逆向&#xff0c;哈哈哈 Rusty Vault 題目描述&#xff1a; In the heart…

Git和GitHub基礎教學

文章目錄 1. 前言2. 歷史3. 下載安裝Git3.1 下載Git3.2 安裝Git3.3 驗證安裝是否成功 4. 配置Git5. Git基礎使用5.1 通過Git Bash使用5.1.1 創建一個新的倉庫。5.1.1.1 克隆別人的倉庫5.1.1.2 自己創建一個本地倉庫 5.1.2 管理存檔 5.2 通過Visual Studio Code使用 6. Git完成遠…

MySQL中like模糊查詢如何優化?

大家好&#xff0c;我是鋒哥。今天分享關于【MySQL中like模糊查詢如何優化?】面試題。希望對大家有幫助&#xff1b; MySQL中like模糊查詢如何優化? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 MySQL 中&#xff0c;LIKE 模糊查詢雖然非常常見&#xff0c;…

?LeetCode(數學分類) 2. 兩數相加——暴力與優化?

?LeetCode(數學分類) 2. 兩數相加——暴力與優化? 提示&#xff1a; 每個鏈表中的節點數在范圍 [1, 100] 內 0 < Node.val < 9 題目數據保證列表表示的數字不含前導零 題解&#xff1a; 暴力與優化&#xff0c;暴力即轉換為十進制解題&#xff0c;優化即直接在鏈表上進…

①Modbus TCP轉Modbus RTU/ASCII網關同步采集無需編程高速輕松組網

Modbus TCP轉Modbus RTU/ASCII網關同步采集無需編程高速輕松組網https://item.taobao.com/item.htm?ftt&id784749793551 MODBUS TCP 通信單元 MODBUS TCP 轉 RS485 MS-A1-50X1 系列概述 MS-A1-50X1 系列概述 MS-A1-50X1系列作為MODBUS TCP通信的服務器進行動作。可通…

基于PyTorch的深度學習——機器學習3

激活函數在神經網絡中作用有很多&#xff0c;主要作用是給神經網絡提供非線性建模能力。如果沒有激活函數&#xff0c;那么再多層的神經網絡也只能處理線性可分問題。 在搭建神經網絡時&#xff0c;如何選擇激活函數&#xff1f;如果搭建的神經網絡層數不多&#xff0c;選擇si…