Jinja2,由Flask框架的創作者開發,是一款功能豐富的模板引擎,以其完整的Unicode支持、靈活性、高效性和安全性而備受推崇。最初受Django模板引擎啟發,Jinja2為Flask提供了強大的模板支持,後來也成為其他項目的首選。在本文中,我們將深入探討Jinja2的特性、語法以及如何在Fl... ...
C語言【文件操作】
1、輸入/輸出流的定義。
C語言中,文件輸入/輸出以流的方式進行。
讀還是寫,輸入還是輸出,是站在記憶體(程式)的角度來看的。從程式(記憶體)向 數據源(如文件、網路等)傳遞數據的過程叫做讀數據,讀數據使用的路徑叫做輸入流,一般讀數據的過程是一個解碼的過程;從數據源(如文件、網路等)向 記憶體(程式)傳遞數據的過程叫做寫數據,寫數據使用的路徑叫做輸出流,一般寫數據的過程是一個編碼的過程。
編碼和解碼使用的字元集不一致時會出現亂碼。
2、標準輸入輸出(一般指從鍵盤輸入,從控制台輸出)
scanf(...) 和 printf(...) 略
// getchar 用於從標準輸入流(通常是鍵盤)讀取一個字元。以下是其函數定義:
int getchar(void); // 返回一個數值(讀取的字元的ASCII碼),用變數接收處理
// putchar 用於將一個字元寫入到標準輸出流(通常是控制台)。以下是其函數定義:
int putchar(int character); // 返回一個整數值(寫入字元的ASCII碼)。參數為寫入字元。
// gets 用於從標準輸入流讀取一個字元串。
char *gets(char *str); // 返回值和參數都是讀取到的那個字元串。
// puts 用於將參數輸出到控制台。
int puts(const char *str); // 返回成功輸出的字元個數。參數為要輸出的字元串。
// 有些函數主要作用是操作文件的(比如從文件中讀數據),改變一下參數,也可成為標準輸入輸出(比如從控制臺中拿數據),比如下麵這個函數:
fgets(指針, 長度, stdin); // 第一個參數存數據,長度,stdin指定為操作對象為控制台。
3、文件讀寫
以下的文件操作函數都在<stdio.h>中
/**
* 打開文件
* 返回一個操作文件的指針。
* 第一個參數為要操作的文件路徑及文件名。
* 相對路徑和絕對路徑知識略。win路徑分隔符為/或\\(轉義),Unix為/,當前目錄下可以加./也可不加。
* 第二個參數為模式。如"r" ----- 這個模式是個字元串。
* r只讀。w清空原文件並寫入。a追加。b二進位。+為省略r和w。(b和+不能單獨使用)
* 組合有:rb、wb、ab、r+、w+、a+、rb+、r+b、wb+、w+b、ab+、a+b
* r/r+不創建新文件,文件不存在時不能正確讀取; 寫文件時,如果目錄不存在則報錯
* 使用w時,未關閉流繼續寫則為追加。
*/
FILE *fopen(const char *filename, const char *mode);
/*
寫文件
*/
// 第一種。一次寫一個字元。
int fputc(int character, FILE *stream); // 成功返回寫入字元的ASCII碼;失敗返回EOF,即-1
// 第二種。寫入字元串。第一個參數為要寫入的字元串;第二個參數為文件指針。
int fputs(const char *str, FILE *stream); // 成功返回寫入的字元個數;失敗返回EOF,即-1
// 第三種。第一個參數為文件指針;第二個參數為帶占位符的字元串;...為可變參。
int fprintf(FILE *stream, const char *format, ...); //成功返回寫入字元個數;失敗返回EOF,即-1
/*
讀文件
*/
// 第一種。讀一個字元。
int fgetc(FILE *stream); // 返回讀取字元的ASCII碼。失敗返回EOF,即-1
// 第二種。讀一個字元串。之前介紹過它的讀取控制台的數據。第二個參數為個數;第三個參數為文件指針或指定控制台讀
char *fgets(char *str, int num, FILE *stream); // 返回值和第一個參數都是讀取到的字元串。失敗返回NULL。
// 第三種。
int fscanf(FILE *stream, const char *format, ...);
fscanf(file, "%s %s %d", msg1, msg2, &num); // 讀取到後面的變數中。占位符之間的空格表示文件中的空格或換行。
補
union {
int a;
int b;
} *p, u;
p = &u; // 對於自定義數據類型來說,下麵要使用指針時,必須這樣指向一下。
const int *p; // p可改變指向,*p不可改變
int const *p; // p可改變指向,*p不可改變
int * const p; // p不可改變指向,*p可改變
cosnt int * const p; // p不可改變指向,*p也不可改變
// 簡單來說,p前的const把p給鎖定了,*前的const把*p給鎖定了,都有則都鎖定。
// int 和 const 緊挨著時,他倆可以交換位置。
在vscode中,讓編譯出的可執行文件在控制台輸出且編碼方式改為GBK編碼的方式為:task.json文件中的args屬性中添加:"-fexec-charset=gbk";在lauch.json文件中修改"configurations"屬性第一個數組的“externalconsole”屬性改為true。
getchar()會吃掉'\n',他就相當於scanf("%c", 變數); 所以有時需要使用兩個getchar()才可以使控制台輸入完後停留。
scanf("%d\n", 變數); 它不吃回車或換行是因為它不是%c。如果它在getchar()前,它前面如果還有輸入,輸入中如果按了回車它也不吃,它後面的getchar()也吃不掉,回車就被消耗掉了。
#include<stdlib.h>
int main(){
system("這裡面可以填寫cmd的命令");
return 0;
}
case中的break是跳出switch;if中的break是跳出這層迴圈。
註意下麵代碼中的知識點
char *p = "hello"; // 這個hello是個字面量,不可更改
*(p+2) = 'a'; //報錯