目次
C 標準ライブラリ -
導入
<stdio.h> は、サイズ関連の操作を処理するために一般的に使用される関数と型定義を提供する C 言語の標準ライブラリです。
ライブラリ変数
<stddef.h> で定義されている型は次のとおりです。
- size_t: オブジェクトのサイズを表すために使用される符号なし整数型。
- ptrdiff_t: 2 つのポインターの差を表すために使用される符号付き整数型。
- wchar_t: ワイド文字タイプ。ワイド文字を処理するときに使用されます。
これらの型は、サイズ、ポインター操作、ワイド文字のサポートを提供するために、C の標準ライブラリ関数で頻繁に使用されます。
クホン
<stddef.h> よく使用されるいくつかのマクロはヘッダー ファイルで定義されています。
- NULL: 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 を使用して配列のサイズを計算し、& 演算子を使用して配列内の 2 つの要素のアドレスを取得してポインターの差を計算します。次に、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> は、入出力に関連する変数の型、マクロ、関数を定義する C 標準ライブラリのヘッダー ファイルです。このヘッダー ファイルは、標準入力、標準出力、およびファイル操作のサポートを提供します。
ライブラリ変数
-
size_t: これは、オブジェクトのサイズを表すために使用される符号なし整数型です。通常、sizeof 演算子の結果として使用されます。たとえば、size_t を使用して、配列のサイズまたはバッファの長さを表すことができます。
-
FILE: ファイル ストリーム情報を表すために使用される構造タイプです。これには、ファイル ポインター、ファイル ステータス フラグ、読み取りおよび書き込みの場所など、ファイルの操作に必要なすべての情報が含まれています。 FILE 型のポインタを使用すると、ファイルを開いたり、閉じたり、読み書きしたりできます。
-
fpos_t: これは、ファイル内の任意の場所に情報を保存するために使用されるタイプです。ファイル内の任意のオフセットを表すことができます。 fpos_t 型の変数は、ファイルを検索して操作するために、fseek や fgetpos などの関数とともによく使用されます。
クホン
以下は、ヘッダー ファイル stdio.h で定義されているマクロです。
-
NULL: これは、NULL ポインター定数の値です。通常、ポインタ変数を初期化して、有効なメモリ アドレスを指していないことを示すために使用されます。
-
_IOFBF、_IOLBF、および _IONBF: これらのマクロは、ファイルのバッファリング タイプを設定するために setvbuf 関数の 3 番目のパラメータで使用されます。 _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) 指定されたストリーム ストリームのファイルの終わりとエラー識別子をクリアします。 |
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) ストリームのファイル位置を指定されたオフセット offset に設定します。パラメータ オフセット は、指定された いつ の位置から検索するバイト数を意味します。 |
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 | removeint replace(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) ストリームのバッファリング方法を定義する別の関数。 |
19 | FILE *tmpfile(void) バイナリ更新モード (wb+) で一時ファイルを作成します。 |
20 | char *tmpnam(char *str) 以前は存在しなかった有効な一時ファイル名を生成して返します。 |
21 | int fprintf(FILE *stream, const char *format, ...) フォーマットされた出力をストリーム ストリームに送信します。 |
22 | int printf(const char *format, ...) フォーマットされた出力を標準出力に送信します。 |
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) 引数リストを使用して、フォーマットされた出力を標準出力に送信します。 |
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 で指定された文字 (符号なし文字) を指定されたストリームに書き込み、位置識別子を設定します。 |
33 | int fputs(const char *str, FILE *stream) 指定されたストリーム stream に文字列を書き込みますが、null 文字は含まれません。 |
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 で指定された文字 (符号なし文字) を指定されたストリームに書き込み、位置識別子を設定します。 |
38 | int putchar(int char) パラメータ char で指定された文字 (符号なし文字) を標準出力 stdout に書き込みます。 |
39 | int put(const char *str) null 文字までの文字列を標準出力 stdout に書き込みます (null 文字は含みません)。出力には改行が追加されます。 |
40 | int ungetc(int char, FILE *stream) 文字 char (符号なし文字) を指定されたストリームにプッシュし、文字の次に読み取られるようにします。 |
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 関数を使用してファイルからデータを 1 行ずつ読み取り、バッファに格納し、 printf 関数を使用してデータをコンソールに出力する方法を示します。最後に、fclose 関数を使用してファイルを閉じます。
この例では、「example.txt」という名前のテキスト ファイルが現在のディレクトリに存在し、読み取り可能であることを前提としていることに注意してください。ファイルが存在しないか、読み取れない場合、プログラムはエラー メッセージを出力します。