目錄
C 標準庫 -?
簡介
庫變量
庫宏
實例
C 標準庫 -?
簡介
庫變量
庫宏
庫函數
實例
C 標準庫 -?<stddef.h>
簡介
<stdio.h> 是 C 語言中的一個標準庫,它提供了一些常用的函數和類型定義,用于處理與大小相關的操作。
庫變量
在 <stddef.h> 中定義的類型有:
- size_t:無符號整數類型,用于表示對象的大小。
- ptrdiff_t:有符號整數類型,用于表示兩個指針之間的差值。
- wchar_t:寬字符類型,在處理寬字符時使用。
這些類型在 C 語言中經常被用于標準庫函數中,以提供對大小、指針操作和寬字符的支持。
庫宏
<stddef.h> 頭文件中定義了一些常用的宏。
- NULL:空指針常量的值。
- offsetof(type, member-designator):生成一個類型為 size_t 的整型常量,它表示結構體成員相對于結構體起始位置的字節偏移量。其中,type 表示結構體類型,member-designator 表示結構體成員的標識符。
值得注意的是,offsetof 宏只能用于標準數據類型中的結構體和聯合體,不能用于位域。使用時應該遵循 C 語言的規范,同時需要注意不同編譯器可能對其實現方式存在差異。
實例
#include <stdio.h>
#include <stddef.h>int main() {int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};size_t size = sizeof(arr); // 計算數組 arr 的大小ptrdiff_t diff = &arr[5] - &arr[0]; // 計算指針差值printf("數組 arr 的大小為 %zu\n", size); // 使用 %zu 輸出 size_t 類型printf("&arr[5] - &arr[0] 的差值為 %td\n", diff); // 使用 %td 輸出 ptrdiff_t 類型struct Person {char name[20];int age;double height;};size_t offset = offsetof(struct Person, age); // 計算結構體成員偏移量printf("結構體成員 age 在結構體中的偏移量為 %zu\n", offset); // 使用 %zu 輸出 size_t 類型return 0;
}
在這個示例中,我們首先定義了一個整型數組 arr,然后使用 sizeof 計算了數組的大小,并使用 & 運算符獲取了數組中兩個元素的地址,用于計算指針差值。接著我們定義了一個名為 Person 的結構體,使用 offsetof 宏計算了結構體成員 age 相對于結構體起始位置的偏移量,并將結果輸出到屏幕上。最后返回 0 表示程序正常結束。
值得注意的是,在使用 size_t 和 ptrdiff_t 類型時,我們分別使用了 %zu 和 %td 作為格式化輸出的占位符。這是因為 size_t 是無符號整數類型,而 ptrdiff_t 是有符號整數類型,它們的輸出格式與普通的整型類型不同。
讓我們編譯并運行上面的程序,這將產生以下結果:
數組 arr 的大小為 40
&arr[5] - &arr[0] 的差值為 5
結構體成員 age 在結構體中的偏移量為 20
C 標準庫 -?<stdio.h>
簡介
<stdio.h> 是 C 標準庫中的頭文件,它定義了與輸入和輸出相關的變量類型、宏和函數。這個頭文件提供了對標準輸入、標準輸出和文件操作的支持。
庫變量
-
size_t:這是一種無符號整數類型,用于表示對象的大小。通常用于 sizeof 運算符的結果。例如,可以使用 size_t 來表示數組的大小或緩沖區的長度。
-
FILE:這是一個結構體類型,用于表示文件流的信息。它包含了操作文件所需的所有信息,如文件指針、文件狀態標志、讀寫位置等。通過使用 FILE 類型的指針,我們可以打開、關閉、讀取和寫入文件。
-
fpos_t:這是一種類型,用于存儲文件中任意位置的信息。它可以表示文件中的任何偏移量。fpos_t 類型的變量通常與 fseek 和 fgetpos 等函數一起使用,用于在文件中進行定位和操作。
庫宏
下面是頭文件 stdio.h 中定義的宏:
-
NULL:這是一個空指針常量的值。通常用于初始化指針變量,以表示它們不指向任何有效的內存地址。
-
_IOFBF、_IOLBF 和 _IONBF:這些宏用于 setvbuf 函數的第三個參數,用于設置文件的緩沖類型。_IOFBF 表示全緩沖,_IOLBF 表示行緩沖,_IONBF 表示無緩沖。
-
BUFSIZ:這是一個整數值,代表了 setbuf 函數使用的緩沖區大小。對于標準 I/O 庫而言,這通常是一個較大的數值(如 512 或 1024),以便提高讀寫效率。
-
EOF:這是一個負整數值,用于表示已經到達文件結束或讀寫操作失敗的情況。在標準輸入輸出函數中,當遇到文件結束或錯誤時,它們會返回 EOF。
-
FOPEN_MAX:這是一個整數值,代表了系統可以同時打開的文件數量。通常情況下,它的值是一個較大的數值(如 256 或更多)。
-
FILENAME_MAX:這是一個整數值,代表了字符數組可以存儲的文件名的最大長度。如果實現沒有任何限制,則該值應為推薦的最大值。
-
L_tmpnam:這是一個整數值,代表了字符數組可以存儲的由 tmpnam 函數創建的臨時文件名的最大長度。
-
SEEK_CUR、SEEK_END 和 SEEK_SET:這些宏用于在 fseek 函數中進行文件定位。它們分別表示當前位置、文件尾和文件開頭。
-
TMP_MAX:這是一個整數值,代表了 tmpnam 函數可生成的獨特文件名的最大數量。
-
stderr、stdin 和 stdout:這些宏是指向 FILE 類型的指針,分別對應于標準錯誤、標準輸入和標準輸出流。它們通常被用作默認的文件指針,以方便進行輸入輸出操作。
庫函數
下面是頭文件 stdio.h 中定義的函數:
為了更好地理解函數,請按照下面的序列學習這些函數,因為第一個函數中創建的文件會在后續的函數中使用到。
序號 | 函數 & 描述 |
---|---|
1 | int fclose(FILE *stream) 關閉流 stream。刷新所有的緩沖區。 |
2 | void clearerr(FILE *stream) 清除給定流 stream 的文件結束和錯誤標識符。 |
3 | int feof(FILE *stream) 測試給定流 stream 的文件結束標識符。 |
4 | int ferror(FILE *stream) 測試給定流 stream 的錯誤標識符。 |
5 | int fflush(FILE *stream) 刷新流 stream 的輸出緩沖區。 |
6 | int fgetpos(FILE *stream, fpos_t *pos) 獲取流 stream 的當前文件位置,并把它寫入到 pos。 |
7 | FILE *fopen(const char *filename, const char *mode) 使用給定的模式 mode 打開 filename 所指向的文件。 |
8 | size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 從給定流 stream 讀取數據到 ptr 所指向的數組中。 |
9 | FILE *freopen(const char *filename, const char *mode, FILE *stream) 把一個新的文件名 filename 與給定的打開的流 stream 關聯,同時關閉流中的舊文件。 |
10 | int fseek(FILE *stream, long int offset, int whence) 設置流 stream 的文件位置為給定的偏移 offset,參數?offset?意味著從給定的?whence?位置查找的字節數。 |
11 | int fsetpos(FILE *stream, const fpos_t *pos) 設置給定流 stream 的文件位置為給定的位置。參數?pos?是由函數 fgetpos 給定的位置。 |
12 | long int ftell(FILE *stream) 返回給定流 stream 的當前文件位置。 |
13 | size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的數組中的數據寫入到給定流 stream 中。 |
14 | int remove(const char *filename) 刪除給定的文件名 filename,以便它不再被訪問。 |
15 | int rename(const char *old_filename, const char *new_filename) 把 old_filename 所指向的文件名改為 new_filename。 |
16 | void rewind(FILE *stream) 設置文件位置為給定流 stream 的文件的開頭。 |
17 | void setbuf(FILE *stream, char *buffer) 定義流 stream 應如何緩沖。 |
18 | int setvbuf(FILE *stream, char *buffer, int mode, size_t size) 另一個定義流 stream 應如何緩沖的函數。 |
19 | FILE *tmpfile(void) 以二進制更新模式(wb+)創建臨時文件。 |
20 | char *tmpnam(char *str) 生成并返回一個有效的臨時文件名,該文件名之前是不存在的。 |
21 | int fprintf(FILE *stream, const char *format, ...) 發送格式化輸出到流 stream 中。 |
22 | int printf(const char *format, ...) 發送格式化輸出到標準輸出 stdout。 |
23 | int sprintf(char *str, const char *format, ...) 發送格式化輸出到字符串。 |
24 | int vfprintf(FILE *stream, const char *format, va_list arg) 使用參數列表發送格式化輸出到流 stream 中。 |
25 | int vprintf(const char *format, va_list arg) 使用參數列表發送格式化輸出到標準輸出 stdout。 |
26 | int vsprintf(char *str, const char *format, va_list arg) 使用參數列表發送格式化輸出到字符串。 |
27 | int fscanf(FILE *stream, const char *format, ...) 從流 stream 讀取格式化輸入。 |
28 | int scanf(const char *format, ...) 從標準輸入 stdin 讀取格式化輸入。 |
29 | int sscanf(const char *str, const char *format, ...) 從字符串讀取格式化輸入。 |
30 | int fgetc(FILE *stream) 從指定的流 stream 獲取下一個字符(一個無符號字符),并把位置標識符往前移動。 |
31 | char *fgets(char *str, int n, FILE *stream) 從指定的流 stream 讀取一行,并把它存儲在 str 所指向的字符串內。當讀取?(n-1)?個字符時,或者讀取到換行符時,或者到達文件末尾時,它會停止,具體視情況而定。 |
32 | int fputc(int char, FILE *stream) 把參數 char 指定的字符(一個無符號字符)寫入到指定的流 stream 中,并把位置標識符往前移動。 |
33 | int fputs(const char *str, FILE *stream) 把字符串寫入到指定的流 stream 中,但不包括空字符。 |
34 | int getc(FILE *stream) 從指定的流 stream 獲取下一個字符(一個無符號字符),并把位置標識符往前移動。 |
35 | int getchar(void) 從標準輸入 stdin 獲取一個字符(一個無符號字符)。 |
36 | char *gets(char *str) 從標準輸入 stdin 讀取一行,并把它存儲在 str 所指向的字符串中。當讀取到換行符時,或者到達文件末尾時,它會停止,具體視情況而定。 |
37 | int putc(int char, FILE *stream) 把參數 char 指定的字符(一個無符號字符)寫入到指定的流 stream 中,并把位置標識符往前移動。 |
38 | int putchar(int char) 把參數 char 指定的字符(一個無符號字符)寫入到標準輸出 stdout 中。 |
39 | int puts(const char *str) 把一個字符串寫入到標準輸出 stdout,直到空字符,但不包括空字符。換行符會被追加到輸出中。 |
40 | int ungetc(int char, FILE *stream) 把字符 char(一個無符號字符)推入到指定的流 stream 中,以便它是下一個被讀取到的字符。 |
41 | void perror(const char *str) 把一個描述性錯誤消息輸出到標準錯誤 stderr。首先輸出字符串 str,后跟一個冒號,然后是一個空格。 |
42 | int snprintf(char *str, size_t size, const char *format, ...) 格式字符串到 str 中。 |
實例
#include <stdio.h>int main() {FILE *file;char buffer[100];// 打開文件以供讀取file = fopen("D://example.txt", "r");if (file == NULL) {printf("無法打開文件\n");return 1;}// 從文件讀取數據并輸出到控制臺while (fgets(buffer, sizeof(buffer), file)) {printf("%s", buffer);}// 關閉文件fclose(file);return 0;
}
這個示例演示了如何使用fopen函數打開一個文件,并使用fgets函數從文件中逐行讀取數據存儲到緩沖區中,然后使用printf函數將數據輸出到控制臺。最后,使用fclose函數關閉文件。
請注意,示例中假設當前目錄下存在名為"example.txt"的文本文件,并且該文件可讀。如果文件不存在或無法讀取,程序將打印一條錯誤消息。