【C語言】—— 文件操作(下)

??

前言:

??
??
??在 【C語言】—— 文件操作(上) 一文中,我們對文件有了一個簡單的了解,并學會了如何打開和關閉文件,下面就讓我們一起來學學如何對文件進行讀寫吧。
??
??

五、文件的順序讀寫

5.1、 順序讀寫函數介紹

函數名功能適用于
fgetc字符輸入函數所有輸入流
fputc字符輸出函數所有輸出流
fgets文本行輸入函數所有輸入流
fputs文本行輸出函數所有輸出流
fscanf格式化輸入函數所有輸入流
fprintf格式化輸出函數所有輸出流
fread二進制輸入文件
fwrite二進制輸出文件

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

??下面我們對上述函數一一進行介紹
??

5.2、 f p u t c fputc fputc 函數

在這里插入圖片描述

  • 函數功能將一個字符寫入流中,這個流其實就是文件流
  • 函數參數
    • i n t int int? c h a r a c t e r character character要寫入的字符,字符的本質就是 A S C I I ASCII ASCII 碼值,因此這里參數類型為 i n t int int 沒有問題
    • F I L E FILE FILE * s t r e a m stream stream :指向要寫入文件的文件指針
  • 返回類型:返回類型是 int:當寫入成功,返回寫入的值,當寫入失敗,返回EOF(-1)
    ??

函數使用:

#include<stdio.h>int main()
{FILE* pf = NULL;//打開文件pf = fopen("test.txt", "w");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//寫文件fputc('a', pf);fputc('b', pf);fputc('c', pf);//寫入26個字母char ch = 0;for (ch = 'a'; ch <= 'z'; ch++){fputc(ch, pf);}//關閉文件fclose(pf);pf = NULL;
}

在這里插入圖片描述

??這樣,字符就寫好了。
??
??當寫入字符時,還有一些細節需要注意:當一個文件打開時,最開始其實是有一個光標指向第一個位置,每當用 f p u t c fputc fputc 函數寫入一個字符光標則后退一格。光標是用來維護此時此刻我們這個文件寫到哪的,而且是按照一定的順序往后走的,因此叫做順序讀寫

??

5.3、 f g e t c fgetc fgetc 函數

在這里插入圖片描述

  • 函數功能:從流(文件)中獲取一個字符
  • 返回值:返回類型為 i n t int int 。如果成功,就會將讀到的字符返回,如果讀取失敗或者遇到文件末尾返回EOF(-1)
    • 為什么返回類型是 int 呢?正是因為它會返回兩種類型的值:字符的 A S C I I ASCII ASCII碼 值EOF;如果返回類型為 char,則 EOF 無法返回
      ??

函數使用:

#include<stdio.h>int main()
{FILE* pf = NULL;//打開文件pf = fopen("test.txt", "r");//文件操作if (NULL == pf){perror("fopen fail");return 1;}//讀文件int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}printf("\n");//關閉文件fclose(pf);pf = NULL;
}

運行結果:

在這里插入圖片描述

??而同樣,以只讀的方式打開文件,剛開始光標是在第一個位置,即指向 a a a每讀一個字符,光標向后退一位

??

5.4、 f p u t s fputs fputs 函數

在這里插入圖片描述

  • 函數功能將 str 字符串寫入文件流中,直至遇到 ‘\0’ 停止(‘\0’不會被寫入)

?? 注:多次調用該函數,并不會實現主動換行,要想換行應主動輸入‘\n’
??
函數使用:

#include<stdio.h>int main()
{//打開文件FILE* pf = NULL;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen fail");return 1;}//寫文件fputs("hello", pf);fputs("world\n", pf);fputs("hello csdn\n", pf);//關閉文件fclose(pf);pf = NULL;return 0;
}

運行結果:
在這里插入圖片描述
??我們可以看到,加了換行符后,文件的光標是直接落到下一行的。

??

5.5、 f g e t s fgets fgets 函數

在這里插入圖片描述

  • 函數功能從流中最多讀取 num 個字符,并放在 str 所指向的空間中
    • 函數讀 n u m num num 個字符,但是最多只能讀取 n u m num num - 1個,因為最后一個位置函數會自己加上 ‘\0’
    • 該函數不會換行讀取。當 n u m num num 大于字符數時,遇到換行符 ‘\n’,將 ‘\n’ 讀取后,不再往下讀取,自己加上 ‘\0’ 后停止。
    • 當函數讀取成功,返回的是目標空間的地址;讀取失敗則返回空指針(NULL)

??
函數使用:

#include<stdio.h>int main()
{//打開文件FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}//讀文件char arr1[10] = "xxxxxxxxx";fgets(arr1, 8, pf);char arr2[10] = "xxxxxxxxx";fgets(arr2, 8, pf);//關閉文件fclose(pf);pf = NULL;return 0;
}

運行結果:

在這里插入圖片描述

??

5.6、 f p r i n t f fprintf fprintf 函數

在這里插入圖片描述

??
??該函數的功能是將數據以格式化的形式寫入流中(以文本的形式)
??
??其實, f p r i n t f fprintf fprintf 函數 p r i n t f printf printf 函數是非常相像的,讓我們來對比一下
??

在這里插入圖片描述

??
??他們的區別僅僅是第一個參數的有無而已,其他都是一模一樣的,所以你會用 p r i n t f printf printf你就會用 f p r i n t f fprintf fprintf
??
??多的一個參數是什么呢?是文件流,你需要將數據輸出到的那個文件流
??

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "張三", 20, 75.5f };//打開文件FILE* pf = NULL;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen fail");return 1;}//寫文件fprintf(pf, "%s %d %f", s.name, s.age, s.score);//關閉文件fclose(pf);pf = NULL;return 0;
}

運行結果:
在這里插入圖片描述
??

5.7、 f s c a n f fscanf fscanf 函數

在這里插入圖片描述

??
??該函數的功能是從文件流中讀取格式化的數據。
??
??不難發現, f s a n f fsanf fsanf s c a n f scanf scanf 函數很像,我們來對比一下

??

在這里插入圖片描述

??
??同 f p r i n t f fprintf fprintf 一樣, f s c a n f fscanf fscanf s c a n f scanf scanf 只是相差一個參數而已,你會用 s c a n f scanf scanf 自然也就會用 f s c a n f fscanf fscanf 函數,第一個參數即是你所要讀取的文件流
??

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { 0 };//打開文件FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}//讀文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//printf("%s %d %.2f\n", s.name, s.age, s.score);fprintf(stdout, "%s %d %.2f\n", s.name, s.age, s.score);//關閉文件fclose(pf);pf = NULL;return 0;
}

??
運行結果:

在這里插入圖片描述

??注意看,上述代碼用了 f p r i n t f fprintf fprintf 來將數據打印在屏幕上

??還記得最開始的表格中, f p r i n t f fprintf fprintf 最后一列寫的是所有輸出流嗎?這所有輸出流就包括了文件流標準輸出流,既然 f p r i n t f fprintf fprintf 可以輸出到文件中,那么自然也就可以輸出到屏幕中,完成 p r i n t f printf printf 一樣的功能。

??而同理,前面講的 f p u t c fputc fputc f g e t s fgets fgets f s c a n f fscanf fscanf 等函數也可以從標準輸入(輸出)流中獲取(輸出)數據。

??

5.8、 p r i n t f / f p r i n t f / s p r i n t f printf/fprintf/sprintf printf/fprintf/sprintf 函數對比

??
通過我們前面的學習,我們已經知道了 p r i n t f printf printf f p r i n t f fprintf fprintf 函數的作用:

  • p r i n t f printf printf:把數據以格式化的形式打印在標準輸出流
  • f p r i n t f fprintf fprintf : 把數據以格式化的形式打印在 指定的輸出流

那么 s p r i n t f sprintf sprintf 函數又是作什么的呢?我們一起來看看

在這里插入圖片描述

??
??該函數的作用是:將數據以格式化的形式寫到字符串。其實就是把格式化的數據轉換成字符串
??

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "張三", 20, 75.5f };char buf[50] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);printf("%s\n", buf);return 0;
}

運行結果:
在這里插入圖片描述
??該代碼完全是以 %s 的形式打印的,說明數據已經完全轉換成字符串了。

??

5.9、 s c a n f / f s c a n f / s s c a n f scanf/fscanf/sscanf scanf/fscanf/sscanf 函數對比

??同樣,通過我們前面的學習,我們已經知道了 s c a n f scanf scanf f s c a n f fscanf fscanf 函數的作用:

  • s c a n f scanf scanf:從 標準輸入流 中讀取格式化的數據
  • f s c a n f fscanf fscanf:從 指定輸入流 中讀取格式化的數據

??那 s s c a n f sscanf sscanf 的功能又是什么呢?學習了 s p r i n t f sprintf sprintf ,我們猜測,其應該是從字符串中讀取格式化數據,是不是呢?我們一起來看看
??

在這里插入圖片描述

??
函數功能從字符串中讀取格式化數據
??

#include<stdio.h>struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { "張三", 20, 75.5f };char buf[50] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);struct S a = { 0 };sscanf(buf, "%s %d %f", s.name, &(s.age), &(s.score));printf("%s %d %f\n", s.name, s.age, s.score);return 0;
}

運行結果:

在這里插入圖片描述

??
??

5.10、 f w r i t e fwrite fwrite 函數

在這里插入圖片描述

  • 函數功能:以二進制的形式將內存塊中的數據入文件中
  • 參數介紹
    • c o n s t const const? v o i d void void * p t r ptr ptr p t r ptr ptr 是指向要寫入數據的數組的指針
    • s i z e size size_ t t t? s i z e size size:表示要寫入的每個元素的大小
    • s i z e size size_ t t t? c o u n t count count:表示要寫入元素的個數

??
下面我們直接上代碼:

#include<stdio.h>int main()
{int arr[] = { 1,2,3,4,5 };int sz = sizeof(arr) / sizeof(arr[0]);FILE* pf = NULL;pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen fail");return 1;}fwrite(arr, sizeof(arr[0]), sz, pf);fclose(pf);pf = NULL;return 0;
}

??
我們以二進制的方式打開:

在這里插入圖片描述

??

5.11、 f r e a d fread fread 函數

在這里插入圖片描述

??該函數的作用是:以二進制的形式讀取數據到內存中

??我們可以看到,這函數的參數與 f w r i t e fwrite fwrite 是大同小異的,這里就不一一介紹了,我們直接上代碼

#include<stdio.H>int main()
{int arr[5] = { 0 };FILE* pf = NULL;pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen fail");return 1;}fread(arr, sizeof(arr[0]), 5, pf);for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}printf("\n");fclose(pf);pf = NULL;return 0;
}

運行結果:

在這里插入圖片描述

??但是,上面代碼是我提前知道了總共的數據個數,當我不知道數據具體個數是又該怎么辦呢?

??這里,我們需要知道 f r e a d fread fread 函數的返回值,該函數的返回值是讀取到的數據的個數。這時,當我要求讀 7 個數據,而返回值是 5 時,說明數據讀完了。

??上面的代碼我們可以做如下修改:

#include<stdio.h>int main()
{int arr[5] = { 0 };FILE* pf = NULL;pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen fail");return 1;}int i = 0;while (fread(arr + i, sizeof(arr[0]), 1, pf)){printf("%d ", arr[i]);i++;}printf("\n");fclose(pf);pf = NULL;return 0;
}

??
??

六、文件的隨機讀寫

??前面我們所學習到的函數都是順序讀寫,光標是依次往后移動。那能不能做到隨機讀寫呢,即我想在哪里讀寫就在哪讀寫,指那打那。

??當然是可以的,下面讓我們一起來學習。
??

6.1、 f s e e k fseek fseek 函數

在這里插入圖片描述

  • 功能:根據文件指針的位置和偏移量來定位文件指針(光標)
  • 參數介紹
    • l o n g long long? i n t int int? o f f s e t offset offset:相對于起始位置的偏移量,可正可負
    • i n t int int? o r i g i n origin origin起始位置

起始位置選擇:

常量所指位置
SEEK_SET文件的起始位置
SEEK_CUR當前光標位置
SEEK_END文件結尾

??
??這個函數有什么用呢?比如文件中有 a b c d e f g abcdefg abcdefg 的數據,當前光標指向 a a a,而我想直接讀 e e e,這時就可以用該函數移動光標啦。
??

在這里插入圖片描述

例子:

#inclu<stdio.h>int main()
{FILE* pf = NULL;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen fail");return 1;}char ch = 0;ch = fgetc(pf);printf("%c\n", ch);fseek(pf, 3, SEEK_CUR);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}

運行結果:

在這里插入圖片描述

??
??

6.2、 f t e l l ftell ftell 函數

在這里插入圖片描述

f t e l l ftell ftell 函數會返回文件指針(光標) 相對于文件起始位置的 偏移量

??這里,我們想:如果我們讓光標讀到文件末尾,在返回偏移量,是不是就能知道文件的長度呢?答案是肯定的。
??
例子:

#includ<stdio.h>int main()
{FILE* pf;long size;pf = fopen("test.txt", "rb");if (NULL == pf)perror("Error opening file");fseek(pf, 0, SEEK_END); // non-portablesize = ftell(pf);fclose(pf);printf("Size of test.txt: %ld bytes.\n", size);return 0;
}

??
??

6.3、 r e w i n d rewind rewind 函數

在這里插入圖片描述

?? r e w i n d rewind rewind 函數可以讓文件指針回到起始位置

??走的太遠,別忘了回頭路

例子:

#include<stdio.h>int main()
{int n;FILE* pf;char buffer[27];pf = fopen("test.txt", "w+");for (n = 'A'; n <= 'Z'; n++){fputc(n, pf);}rewind(pf);fread(buffer, 1, 26, pf);fclose(pf);buffer[26] = '\0';printf(buffer);return 0;
}

??
??

七、文件讀取結束的判定

7.1、 被錯誤使用的 f e o f feof feof

??
??很多人都以為 f e o f feof feof函數是用來直接判斷文件讀取是否結束。其實這是大錯特錯的
?? f e o f feof feof 的作用是:當文件讀取結束時,判斷讀取結束的原因是否是因為:遇到文件末尾結束

??現在假設文件讀取結束了,但是是什么原因讀取結束的呢?

  1. 有可能遇到文件末尾
  2. 讀取的時候發生了錯誤

?? f e o f feof feof 函數是判斷是否是因為遇到文件末尾而結束的。
??而還有個函數叫 f e r r o r ferror ferror 是用來判斷是否是因為遇到錯誤而讀取結束的
??

??其實在我們打開一個流時,會有兩個標記值

  1. 是否遇到文件末尾
  2. 是否發生錯誤
    ??

??當讀文件的過程中確實是遇到文件末尾了,就會將第一個值標記;遇到錯誤就會將第二個值標記
?? f e o f feof feof是用來檢測第一個標記的; f e r r o r ferror ferror是用來檢測第二個標記

f e o f feof feof 函數:當文件確實是因為讀取到文件末尾而結束時,返回一個非零值,反之返回 0
??
??

7.2、如何判斷文件讀取結束

??那么如何來判斷文件是否讀取結束呢?其實在前面結束各個函數時已經順便介紹了:通過函數的返回值進行判斷!
??

(1)文本文件判斷

函數名正常讀取返回值讀取結束或遇到錯誤的返回值
fgetc返回讀取到的字符的ASCII碼值EOF
fgets返回目標空間的地址NULL

??

(2)二進制文件判斷

??二進制文件用 f r e a d fread fread 進行讀取, f r e a d fread fread 返回值是其讀取到的個數。當其返回值小于實際要讀取的個數時,表示文件讀取結束

??

八、 文件緩沖區

??我們想一個問題:當我們想往文件中存 26 個字母,這 26 個字母是直接從程序(內存)中存到文件(硬盤)中的嗎?
??其實不是的。

??ANSI?C 標準采用 “緩沖文件系統” 處理的數據文件的,所謂緩沖文件系統指的是系統自動在內存中為程序中為每一個正在使用的文件開辟一塊“文件緩沖區”

??從內存向磁盤輸出數據會先送達內存中的緩沖區裝滿緩沖區主動刷新緩沖區才將數據送到磁盤上。

??如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩沖區(充滿緩沖區或刷新緩沖區),然后在從緩沖區逐個地將數據送到程序數據區(程序變量等)。

??緩沖區的大小根據C編譯系統決定的。

在這里插入圖片描述

??那為什么要有文件緩沖區呢?

??其實,當我們向文件中輸入輸出數據時,相關函數會調用操作系統相關接口;這時如果寫一個字符就調用一次操作系統,是不是效率太低,并且我們的操作系統上面可不止跑著一個程序,這時你一直打擾操作系統,操作系統就沒法干活了。
??應用緩沖區,在緩沖區攢夠一定數據再一次性全部錄進,效率就會提升很多

??下面,我們通過一段代碼驗證緩沖區的存在:

#include<stdio.h>
#include <windows.h>
//VS2019 WIN11環境測試
int main()
{FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);//先將代碼放在輸出緩沖區printf("睡眠10秒-已經寫數據了,打開test.txt?件,發現?件沒有內容\n");Sleep(10000);printf("刷新緩沖區\n");fflush(pf);//刷新緩沖區時,才將輸出緩沖區的數據寫到?件(磁盤)//注:fflush 在?版本的VS上不能使?了printf("再睡眠10秒-此時,再次打開test.txt?件,?件有內容了\n");Sleep(10000);fclose(pf);//注:fclose在關閉?件的時候,也會刷新緩沖區pf = NULL;return 0;
}

??這里我們需要注意:

??因為有文件沖區的存在,C語言在操作文件的時候,需要做刷新緩沖區或者在文件操作結束的時候關閉文件

??如果不做,可能導致讀寫文件的問題
??
??
??
??


??好啦,本期關于文件操作的知識就介紹到這里啦,希望本期博客能對你有所幫助。同時,如果有錯誤的地方請多多指正,讓我們在C語言的學習路上一起進步!

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

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

相關文章

2024 年 亞太賽 APMCM (C題)中文賽道國際大學生數學建模挑戰賽 | 量子計算的物流配送 | 數學建模完整代碼+建模過程全解全析

當大家面臨著復雜的數學建模問題時&#xff0c;你是否曾經感到茫然無措&#xff1f;作為2022年美國大學生數學建模比賽的O獎得主&#xff0c;我為大家提供了一套優秀的解題思路&#xff0c;讓你輕松應對各種難題&#xff01; 完整內容可以在文章末尾領取&#xff01; 該段文字…

C++內存管理(候捷)第一講 筆記

內存分配的每一層面 applications可以調用STL&#xff0c;里面會有allocator進行內存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;還可以使用更底層的malloc和free分配和釋放內存。最底層的是系統調用&…

實現好友關注功能的Feed流設計

摘要 在社交網絡應用中&#xff0c;Feed流是展示好友動態的核心功能。本文將探討如何設計一個Feed流系統&#xff0c;以實現好友關注和動態展示的功能。 1. Feed流的基本概念 Feed流是用戶在社交網絡中獲取信息的一種方式&#xff0c;通常按照時間順序展示好友或感興趣的用戶…

Maven Archetype 自定義項目模板:高效開發的最佳實踐

文章目錄 前言一、Maven Archetype二、創建自定義 Maven Archetype三、定制 Archetype 模板四、手動創建 Archetype 模板項目五、FAQ5.1 如何刪除自定義的模板5.2 是否可以在模板中使用空文件夾 六、小結推薦閱讀 前言 在軟件開發中&#xff0c;標準化和快速初始化項目結構能夠…

調用asyncio.to_thread后上下文依然一致嗎

使用Python的asyncio時&#xff0c;可以把一個同步的函數放到線程池中執行從而避免這個函數阻塞asyncio自身的事件循環。比如可以把requests庫的請求放進去 async def to_thread_do_request(url):return await asyncio.to_thread(requests.get, url)這個to_thread_do_request方…

14-20 Vision Transformer用AI的畫筆描繪新世界

概述 毫無疑問,目前最受關注且不斷發展的最重要的主題之一是使用人工智能生成圖像、視頻和文本。大型語言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它們在文本生成方面的許多問題已得到解決。然而,LLM 面臨的一個主要挑戰是它們有時會產生幻覺反應。 最近推出的新模…

分布式計算、異構計算與算力共享

目錄 算力 算力共享的技術支撐 云計算技術 邊緣計算技術 區塊鏈技術 分布式計算、異構計算與算力共享 分布式計算:計算力的“集團軍作戰” 異構計算:計算力的“多兵種協同” 算力共享:計算力的“共享經濟” 深入融合,共創計算新紀元 算力共享對科研領域的影響 …

openmetadata1.3.1 自定義連接器 開發教程

openmetadata自定義連接器開發教程 一、開發通用自定義連接器教程 官網教程鏈接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…

Matplotlib 文本

可以使用 xlabel、ylabel、text向圖中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…

Qt讀取ini格式配置文件的類設計

目錄 1.引言 2.QSettings 2.1.功能特點 2.2.基本用法 3.讀取ini文件配置通用類設計 3.1.設計要點 3.2.完整實現 3.3.調用方法 4.總結 1.引言 在編寫應用程序的時&#xff0c;有些參數需要用戶配置&#xff0c;那么這些參數就涉及到存儲了&#xff0c;單從存儲來講&…

git 還原被刪除的分支

在多人項目開發中&#xff0c;有一次碰到忘記合并到master分支了&#xff0c;直接就把開發分支給刪除了&#xff0c;現在記錄下怎么還原被刪除的分支 必須保證刪除的分支之前已經被推送到了遠程倉庫 # 找出被刪除分支的最后一個提交的哈希值 git reflog show# 找到提交哈希值…

2024/07/04

1、梳理筆記(原創) 2、終端輸入一個日期&#xff0c;判斷是這一年的第幾天 scanf("%d-%d-%d",&y,&m,&d); 閏年2月29天&#xff0c;平年2月28天 #include<stdio.h> int main(int argc, char const *argv[]) {int y0,m0,d0;printf("please ente…

析構函數和拷貝構造函數

文章目錄 析構函數1.析構函數的定義&#xff1a;2.析構函數的語法&#xff1a;3.析構函數的特性&#xff1a; 拷貝構造函數1.拷貝構造函數的定義&#xff1a;2.拷貝構造函數的語法3.拷貝構造函數的特性(1)拷貝構造函數是構造函數的一個重載形式**(這個其實也很好理解&#xff0…

鴻蒙開發設備管理:【@ohos.thermal (熱管理)】

熱管理 該模塊提供熱管理相關的接口&#xff0c;包括熱檔位查詢及注冊回調等功能。 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shi…

如何實現圖片垂直旋轉90度的問題

非常簡單的問題&#xff0c;一串代碼就可以解決。復制修改一下就可以直接使用&#xff0c;一個簡單的小demo。寫項目的時候需要寫的功能&#xff0c;不到二十行代碼就可以實現。 <html> <head><title>旋轉圖片</title><meta http-equiv"Conte…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘測定界報告&#xff08;模板&#xff09;.doc

【高校科研前沿】南京地理與湖泊研究所博士后夏凡為第一作者在環境科學與水資源領域Top期刊發文:鈣對云南洱海溶解有機質與浮游細菌相互作用的調控作用

文章簡介 論文名稱&#xff1a;Calcium regulates the interactions between dissolved organic matter and planktonic bacteria in Erhai Lake, Yunnan Province, China 第一作者及單位&#xff1a;夏凡&#xff08;博士后|中國科學院南京地理與湖泊研究所&#xff09; 通訊…

Git指令

一 參考&#xff1a;https://zhuanlan.zhihu.com/p/389814854 1.clone遠程倉庫 git clone https://git.xiaojukeji.com/falcon-mg/dagger.git 2.增加當前子目錄下所有更改過的文件至index git add . 3.提交并備注‘xxx’ git commit -m ‘xxx’ 4.顯示本地分支 git branch 5.顯…

【pytorch13】激活函數及梯度

什么是激活函數 計算機科學家借鑒生物的神經元機制發明了計算機上的模型&#xff0c;這個模型與生物的神經元非常類似 激活的意思就是z變量要大于0&#xff0c;這一個節點才會激活&#xff0c;否則就會處于睡眠狀態不會輸出電平值 該激活函數在z0處不可導&#xff0c;因此不能…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 實踐 AOP 以及實現事務、用戶填充功能

文章目錄 什么是 AOP &#xff1f;.Net Core 中 有哪些 AOP 框架&#xff1f;基于 Castle DynamicProxy 實現 AOPIOC中使用 Castle DynamicProxy實現事務管理實現用戶自動填充 什么是 AOP &#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面編程&a…