入力を参照する場合、これはプログラムにデータを入力することを意味します。入力は、ファイルの形式またはコマンドラインから行うことができます。C言語には、特定の入力を読み取り、必要に応じてプログラムに入力するための一連の組み込み関数が用意されています。
出力とは、画面、プリンター、または任意のファイルにデータを表示することを意味します。C言語には、データをコンピューター画面に出力し、データをテキストファイルまたはバイナリファイルに保存するための一連の組み込み関数が用意されています。
標準文書
C言語は、すべてのデバイスをファイルとして扱います。したがって、デバイス(ディスプレイなど)はファイルと同じ方法で処理されます。プログラムの実行時に、キーボードと画面にアクセスするために、次の3つのファイルが自動的に開かれます。
標準文書 | ファイルポインタ | 装置 |
---|---|---|
標準入力 | stdin | キーボード |
標準出力 | stdout | 画面 |
標準エラー | stderr | 画面 |
#include <stdio.h> // 执行 printf() 函数需要该库
int main()
{
printf("f"); //显示引号中的内容
return 0;
}
- すべてのC言語プログラムには、main()関数を含める必要があります。コードはmain()関数から実行を開始します。
- printf()は、画面への出力をフォーマットするために使用されます。printf()関数は、「stdio.h」ヘッダーファイルで宣言されています。
- stdio.hはヘッダーファイル(標準の入力および出力ヘッダーファイル)であり、#includeはヘッダーファイルを含めるために使用される前処理コマンドです。コンパイラがprintf()関数を検出したときに、stdio.hヘッダーファイルが見つからない場合、コンパイルエラーが発生します。
- return 0;ステートメントは、プログラムの終了を示すために使用されます。
%d形式の出力整数
#include <stdio.h>
int main()
{
int testInteger = 5;
printf("Number = %d", testInteger);
return 0;
}
- printf()関数の引用符で「%d」(整数)を使用して、整数変数testIntegerを照合し、画面に出力します。
%f形式の出力浮動小数点データ
#include <stdio.h>
int main()
{
float f;
printf("Enter a number: ");
// %f 匹配浮点型数据
scanf("%f",&f);
printf("Value = %f", f);
return 0;
}
getchar()およびputchar()関数
-
int getchar(void)関数は、画面から次に使用可能な文字を読み取り、それを整数として返します。この関数は、同時に1文字のみを読み取ります。ループ内でこのメソッドを使用して、画面から複数の文字を読み取ることができます。
-
int putchar(int c)関数は、文字を画面に出力し、同じ文字を返します。この関数は、同時に1つの文字のみを出力します。このメソッドをループで使用して、画面に複数の文字を出力できます。
#include <stdio.h>
int main( )
{
int c;
printf( "Enter a value :");
c = getchar( );
printf( "\nYou entered: ");
putchar( c );
printf( "\n");
return 0;
}
上記のコードをコンパイルして実行すると、テキストの入力を待機します。テキストを入力してEnterキーを押すと、プログラムは続行され、以下に示すように1文字のみが読み取られます。
Enter a value :abc
You entered: a
scanf()およびprintf()関数
-
int scanf(const char * format、…)関数は、標準の入力ストリームstdinから入力を読み取り、提供された形式に従って入力を参照します。
-
int printf(const char * format、…)関数は、出力を標準出力ストリームstdoutに書き込み、指定された形式に従って出力を生成します。
formatは単純な定数文字列にすることができますが、%s、%d、%c、%fなどを指定して、文字列、整数、文字、または浮動小数点数をそれぞれ出力または読み取ることができます。必要に応じて使用できる他の多くのフォーマットオプションが利用可能です。詳細については、これらの機能のリファレンスマニュアルを確認してください。
#include <stdio.h>
int main( ) {
char str[100];
int i;
printf( "Enter a value :");
scanf("%s %d", str, &i);
printf( "\nYou entered: %s %d ", str, i);
printf("\n");
return 0;
}
上記のコードがコンパイルされて実行されると、テキストの入力を待機します。テキストを入力してEnterキーを押すと、プログラムは続行され、以下に示すように入力を読み取ります。
Enter a value :abc 123
You entered: abc 123
ここで、scanf()は、入力形式が指定した%sおよび%dと同じであることを想定していることに注意してください。つまり、「string integer」を指定する場合は、「stringinteger」などの有効な入力を指定する必要があります。 string "または" integer integer "の場合、誤った入力と見なされます。さらに、文字列を読み取る場合、scanf()はスペースに遭遇する限り読み取りを停止するため、「this istest」はscanf()の3つの文字列です。
ファイルの読み取りと書き込み
ファイルは、テキストファイルであろうとバイナリファイルであろうと、一連のバイトを表します。C言語は、最上位にアクセスするための関数を提供するだけでなく、ストレージデバイス上のファイルを処理するための最下層(OS)の呼び出しも提供します。
ファイルを開く
fopen()関数を使用して、新しいファイルを作成したり、既存のファイルを開いたりできます。この呼び出しにより、タイプFILEのオブジェクトが初期化されます。タイプFILEには、フローを制御するために必要なすべての情報が含まれています。この関数呼び出しのプロトタイプは次のとおりです。
FILE *fopen( const char * filename, const char * mode );
ここで、filenameはファイルに名前を付けるために使用される文字列であり、アクセスモードモードの値は次のいずれかの値になります。
モード | 説明 |
---|---|
r | 既存のテキストファイルを開き、ファイルの読み取りを許可します。 |
w | テキストファイルを開き、ファイルへの書き込みを許可します。ファイルが存在しない場合は、新しいファイルが作成されます。ここでは、プログラムはファイルの先頭からコンテンツを書き込みます。ファイルが存在する場合は、長さがゼロに切り捨てられて書き換えられます。 |
a | テキストファイルを開き、追加モードでファイルに書き込みます。ファイルが存在しない場合は、新しいファイルが作成されます。ここで、プログラムは既存のファイルコンテンツにコンテンツを追加します。 |
r + | テキストファイルを開き、ファイルの読み取りと書き込みを許可します。 |
w + | テキストファイルを開き、ファイルの読み取りと書き込みを許可します。ファイルがすでに存在する場合、ファイルは長さがゼロに切り捨てられます。ファイルが存在しない場合、新しいファイルが作成されます。 |
a + | テキストファイルを開き、ファイルの読み取りと書き込みを許可します。ファイルが存在しない場合は、新しいファイルが作成されます。読み取りはファイルの先頭から開始され、書き込みは追加モードでのみ実行できます。 |
バイナリファイルを処理している場合は、次のアクセスモードを使用して、上記のアクセスモードを置き換える必要があります:
"rb"、 "wb"、 "ab"、 "rb +"、 "r + b"、 "wb +"、 "w + b "、" ab + "、" a + b "
ファイルを閉じる
ファイルを閉じるには、fclose()関数を使用します。関数のプロトタイプは次のとおりです。
int fclose( FILE *fp );
関数fputc()は、パラメーターcの文字値をfpが指す出力ストリームに書き込みます。書き込みが成功した場合は書き込まれた文字を返し、エラーが発生した場合はEOFを返します。次の関数を使用して、nullで終了する文字列をストリームに書き込むことができます。
int fputs( const char *s, FILE *fp );
関数fputs()は、文字列sをfpが指す出力ストリームに書き込みます。書き込みが成功した場合は負でない値を返し、エラーが発生した場合はEOFを返します。int fprintf(FILE * fp、const char * format、…)関数を使用して、文字列をファイルに書き込むこともできます。次の例を試してください。
注:使用可能なtmpディレクトリがあることを確認してください。存在しない場合は、最初にコンピューター上に作成する必要があります。
/ tmpは通常、Linuxシステムの一時ディレクトリです。Windowsシステムで実行している場合は、C:\ tmp、D:\ tmpなどのローカル環境の既存のディレクトリに変更する必要があります。
#include <stdio.h>
int main()
{
FILE *fp = NULL;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
上記のコードをコンパイルして実行すると、/ tmpディレクトリに新しいファイルtest.txtが作成され、2つの異なる関数を使用して2行が書き込まれます。
ファイルを読む
ファイルから1文字を読み取る最も簡単な関数は次のとおりです。
int fgetc( FILE * fp );
fgetc()関数は、fpが指す入力ファイルから文字を読み取ります。戻り値は、読み取られた文字、またはエラーが発生した場合はEOFです。次の関数を使用すると、ストリームから文字列を読み取ることができます。
char *fgets( char *buf, int n, FILE *fp );
関数fgets()は、fpが指す入力ストリームからn-1文字を読み取ります。読み取った文字列をバッファbufにコピーし、最後にnull文字を追加して文字列を終了します。
この関数は、最後の文字を読み取る前にファイルの最後で新しい行の文字「\ n」またはEOFを検出した場合、新しい行の文字を含む、読み取られた文字のみを返します。int fscanf(FILE * fp、const char * format、…)関数を使用してファイルから文字列を読み取ることもできますが、最初のスペースと新行文字が検出されると読み取りが停止します。
#include <stdio.h>
int main()
{
FILE *fp = NULL;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
上記のコードをコンパイルして実行すると、前の部分で作成したファイルが読み取られ、次の結果が生成されます。
1: This
2: is testing for fprintf...
3: This is testing for fputs...
まず、fscanf()メソッドはThisのみを読み取ります。これは、その後にスペースが見つかったためです。次に、fgets()を呼び出して、行の終わりまで残りの部分を読み取ります。最後に、fgets()を呼び出して、2行目を完全に読み取ります。
バイナリI / O機能
次の2つの関数は、バイナリの入力と出力に使用されます。
size_t fread(void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements,
size_t number_of_elements, FILE *a_file);
これらの関数は両方とも、ストレージのブロック(通常は配列または構造)の読み取りと書き込みに使用されます。