C言語によるファイルの読み書き(1)

ファイルの使用方法
意味
指定されたファイルが存在しない場合
"r" (読み取り専用) 既存のファイルを開く際のエラー入力データ用のテキスト ファイル データ
出力用の "w" (書き込み専用)、テキスト ファイルを開く 新しいファイルを作成します
"a" (追加) テキスト ファイルの最後にデータを追加します 新しいファイルを作成します
"rb" (読み取り専用)のみ) 入力データの場合、バイナリ ファイルを開きます。 エラー
"wb" (書き込み専用) 出力データの場合、バイナリ ファイルを開きます。 新しいファイルを作成します。
"ab" (追加) バイナリ ファイルの最後にデータを追加します。 新しいファイルを作成します
。 r+" (読み取りおよび書き込み) 読み取りおよび書き込みの場合、テキスト ファイルを開きます。 エラー
"w+" (読み取りおよび書き込み) 読み取りおよび書き込みの場合、新しいファイルの作成を提案します。
"a+" (読み取りおよび書き込み) ファイルを開きます。ファイルの最後に読み取りと書き込みを行って、新しいファイルを作成します。
「rb+」 (読み取り/書き込み) 読み取りおよび書き込み用のバイナリ ファイルを開く際にエラーが発生しました。
「wb+」 (読み取り/書き込み) 読み取りおよび書き込み用の新しいバイナリ ファイルを作成します。 作成新しいファイル
"ab+" (読み取り/書き込み) バイナリ ファイルを開き、ファイルの最後で読み取りと書き込みを行って、新しいファイル

インスタンス コードを作成します。

/* fopen fclose example */
#include <stdio.h>
int main ()
{
    
    
  FILE * pFile;
  //打开文件
  pFile = fopen ("myfile.txt","w");
  //文件操作
  if (pFile!=NULL)
 {
    
    
    fputs ("fopen example",pFile);
    //关闭文件
    fclose (pFile);
 }
  return 0;
}

4. ファイルのシーケンシャル読み取りおよび書き込み

4.1 シーケンシャル読み取りおよび書き込み関数の概要

関数 関数名は、
文字入力関数 fgetc すべての入力ストリーム
文字
出力関数 fputc すべての出力ストリーム
テキスト行入力関数 fgets すべての入力ストリーム テキスト行出力関数 fputs すべての出力ストリーム フォーマットされた入力関数 fscanf すべての入力ストリーム フォーマットされた出力関数 fprintf すべての出力
ストリームバイナリ入力 fread ファイルバイナリ出力 fwrite ファイル


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
    
    
	FILE* pf = fopen("test.txt", "w");//定义一个变量pf,pf指向这个文件信息区,文件信息区和文件本身相关联,这时候我们就可以读或者写或者对文件做一些其他的事情等等
	if (pf == NULL)
	{
    
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	//写文件
	//......
	//关闭文件
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

ここにいる学生の中には、なぜ pf が指すファイルを閉じるのかと疑問に思う人もいるかもしれません。
これは、ファイルもリソースであるためです。最後に、ファイルを閉じると、リソースが解放されます。プログラムで開くことができるファイルの数には制限があります。無制限に開くことができるという意味ではありません。ファイルが多く、このファイルを閉じないとデータの損失などを引き起こす可能性があるので、必ずファイルを閉じてNULLを設定してください。 fputc関数の
コード
ここに画像の説明を挿入
を見てみましょう。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
    
    
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
    
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	char i = 0;
	for (i = 'a'; i <= 'z'; i++)
	{
    
    
		fputc(i, pf);
	}
	//写文件
	//......
	//关闭文件
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

コードのコピーをコピーして自分でテストできます。
この時点で、test.txt ファイルを開いて、先ほど書いた 26 文字すべてがファイルに書き込まれているかどうかを確認します。見てみましょう。結果は次のとおりです
ここに画像の説明を挿入

これを文字の形式で書きたいとします ファイル内の文字をすべて取り出します 今回は fgetc 関数を使用します fgetc 関数

つまり
ここに画像の説明を挿入
ここに画像の説明を挿入
、間違った文字を読み込んだ場合は EOF が返されます
では見てみましょうコードのところに

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
    
    
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
    
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
    
    
		printf("%c ", ch);
	}
	//char i = 0;
	//for (i = 'a'; i <= 'z'; i++)
	//{
    
    
	//	fputc(i, pf);
	//}
	//写文件
	//......
	//关闭文件
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

ここに画像の説明を挿入
fgetc がファイル内のすべての文字を読み取ることがわかります。
次に、1 行のデータを書き込みます。このとき、fputs 関数を使用する必要があります。fputs 関数は
const
ここに画像の説明を挿入
char * str, FILE * stream
ここでストリームに文字列を書き込むという意味です。文字を書きます 文字列をストリーム (つまり、ファイル) に書き込み、

ここに画像の説明を挿入
誰でも見られるようにします。疑問があるかもしれません。今、26 個の英語の文字を書きましたよね? なぜここの 26 文字が欠けているのでしょうか? これは、ファイルに再度データを書き込むと、元のファイルに書き込んだ内容が自動的にすべてクリアされてから書き直されるためです。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
    
    
	FILE* pf = fopen("test.txt", "w");//"w"改成"a"的时候是追加的意思。我们来看下面的图片
	if (pf == NULL)
	{
    
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	fputs("hello bit", pf);
	//int ch = 0;
	//while ((ch = fgetc(pf)) != EOF)
	//{
    
    
	//	printf("%c ", ch);
	//}
	//char i = 0;
	//for (i = 'a'; i <= 'z'; i++)
	//{
    
    
	//	fputc(i, pf);
	//}
	//写文件
	//......
	//关闭文件
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

FILE pf = fopen("test.txt", "w");//「w」を「a」に変えると追加を意味します。下の図を見てみましょう
ここに画像の説明を挿入
では、データを1行ランダムに読み出したい場合はどうすればいいのかということで、fgets関数を導入します
fgets関数
ここに画像の説明を挿入
ここに画像の説明を挿入
で読み取った文字列は、strが指す空間にコピーされます
文字数最も多くの文字は str にコピーします。

ここに画像の説明を挿入
自分で理解してみてください。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
    
    
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
    
    
		printf("%s\n", strerror(errno));
		return 1;
	}
	char arr[20];
	fgets(arr, 5, pf);
	printf("%s\n", arr);//放5的时候最多能够读到4个
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

ここに画像の説明を挿入
ここに画像の説明を挿入
ここで perror 関数を紹介します。いくつかのperror 関数を使用するとより便利です。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{
    
    
	FILE* pf = fopen("test", "r");
	if (pf == NULL)
	{
    
    
		//printf("%s\n", strerror(errno));
		perror("fopen");
		return 1;
	}
	char arr[20];
	fgets(arr, 5, pf);
	printf("%s\n", arr);//放5的时候最多能够读到4个
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

/ここで fprintf 関数を紹介します。fprintf
関数は
ここに画像の説明を挿入
ここに画像の説明を挿入
次のコードを提供します。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
    
    
	char arr[20];
	int age;
	float score;
};
int main()
{
    
    
	struct S s = {
    
     "zhangsan",25,50.5f };
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
    
    
		//printf("%s\n", strerror(errno));
		perror("fopen");
		return 1;
	}
	fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//fprintf将数据写到文件里面去
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

ファイルからデータを読み取りたい場合は、fscanf 関数を導入する必要があります。 fscanf
関数
ここに画像の説明を挿入
ここに画像の説明を挿入

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
    
    
	char arr[20];
	int age;
	float score;
};
int main()
{
    
    
	struct S s = {
    
     "zhangsan",25,50.5f };
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
    
    
		//printf("%s\n", strerror(errno));
		perror("fopen");
		return 1;
	}
	fscanf(pf, "%s %d %f", s.arr, (&s.age), &(s.score));//fscanf从文件里面去读,将信息从pf指向的文件读出来放到s里面去,再将其打印出来
	printf("%s %d %f", s.arr, s.age, s.score);
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

fwrite 関数の紹介
fwrite 関数
ここに画像の説明を挿入
ここに画像の説明を挿入
このとき、理解できない点があると思いますが、これはバイナリ形式で書かれているためです
fread 関数の紹介です
fread 関数
ここに画像の説明を挿入
バイナリ形式で記述します。バイナリ形式で読み出すことができます
ここに画像の説明を挿入

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#include<stdlib.h>
#include<errno.h>
#include<string.h>
struct S
{
    
    
	char arr[20];
	int age;
	float score;
};
int main()
{
    
    
	struct S s = {
    
     "zhangsan",25,50.5f };
	FILE* pf = fopen("test.txt", "wb");
	if (pf == NULL)
	{
    
    
		perror("fopen");
		return 1;
	}
	//fwrite(&s, sizeof(struct S), 1, pf);
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f\n", s.arr, s.age, s.score);
	fclose(pf);
	pf = NULL;//设置成空指针使其再也找不到这块空间
	return 0;
}

この章は終わりです!

おすすめ

転載: blog.csdn.net/fjj2397194209/article/details/131313358