C语言文件打开关闭详解、文件顺序读写详解。

文件的打开和关闭

fopen函数原型:

FILE *fopen( const char *filename, const char *mode );
  • const char *filename 文件的路径以及名字
  • const char *mode 文件的打开方式
文件打开方式 含义 如果文件不存在
“r” 文件不存在会报错
“w” 写(清空写) 建立一个新的文件
“a” 写(追加写) 建立一个新的文件
“r+” 读写 文件不存在会报错
“w+” 读写(清空写) 建立一个新的文件
“a+” 读写(追加写) 建立一个新的文件
“rb” 读二进制文件 文件不存在会报错
“wb” 写二进制文件(清空写) 建立一个新的文件
“ab” 写二进制文件(追加写) 建立一个新的文件
“rb+” 读写二进制文件 文件不存在会报错
“wb+” 读写二进制文件(清空写) 建立一个新的文件
“ab+” 读写二进制文件(追加写) 建立一个新的文件
  • FILE *fopen 返回一个指向 FILE类型数据的指针变量,通过 FILE*指针指向某个文件的信息区(是一个结构体变量),通过文件信息区就能够访问该文件。如果打开失败返回 NULL 指针

注:使用 "w" 的方式打开文件,会将文件中的内容清空在写。当你使用 "w"的方式打开文件,但是不写任何内容,有清空文件的效果。

文件路径的两种书写方式:

1.使用反斜杠 \ 会使后面的字符转义,所以需要使用 \\两个反斜杠代表一个斜杠。

FILE* fp = fopen("D:\\test.txt" , "w");

2.使用 / 就不需要考虑转义字符的问题了。

FILE* fp = fopen("D:/test.txt", "w");

fclose函数原型:

int fclose( FILE *stream );
  • FILE *stream 指向文件流的指针
  • int fclose 关闭成功返回 0 关闭失败返回 EOF

例1:

#include 
#include 

int main() {

	// 打开文件
	//FILE* fp = fopen("D:\\test.txt" , "w");
	FILE* fp = fopen("D:/test.txt", "w");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}
	// 文件操作
	// ...

	// 关闭文件
	fclose(fp);
	fp = NULL;


	return 0;
}

文件的顺序读写

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
字符串输入函数 fgets 所有输入流
字符串输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件流
二进制输出 fwrite 文件流

stdin 标准输入流(键盘),stdout 标准输出流(屏幕)。

1.fgetc

函数原型:

int fgetc( FILE *stream );
  • FILE *stream 输入流
  • int fgetc 返回该字符的 ASCII 值,失败或文件结束返回 EOF

例:

#include 

int main() {

	FILE* fp = fopen("D:/test.txt", "r");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}
	char ch = fgetc(fp);
	putchar(ch);

	fclose(fp);
	fp = NULL;

	return 0;
}

2.fputc

函数原型:

int fputc( int c, FILE *stream );
  • int c 输出的字符
  • FILE *stream 输出流
  • int fputc 返回该字符的 ASCII 值,失败返回 EOF

例:

#include 

int main() {

	FILE* fp = fopen("D:/test.txt" , "w");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}
	fputc('a' , fp);
	
	fclose(fp);
	fp = NULL;

	return 0;
}

注:fgetc(stdin) == getchar(); fputc('a' , stdout) == putchar('a');


3.fputs

函数原型:

int fputs( const char *string, FILE *stream );
  • const char *string 输出的字符串
  • FILE *stream 输出流
  • int fputs 成功返回非负的值,失败返回 EOF

例:

#include 

int main() {

	FILE* fp = fopen("D:/test.txt" , "w");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}

	fputs("abcdefg" , fp);

	fclose(fp);
	fp = NULL;


	return 0;
}

4.fgets

函数原型:

char *fgets( char *string, int n, FILE *stream );
  • char *string 这是指向一个字符数组的指针,用来存放读取到的字符串。
  • int n 最大读到字符个数,包含 '\0' ,实际读到 n-1 个字符
  • FILE *stream 输入流
  • char *fgets 如果成功返回读取到字符串的首元素地址,失败或者文件结束返回 NULL

例:

#include 
#include 

int main() {

	FILE* fp = fopen("D:/test.txt", "r");
	if (fp == NULL) {
		perror("fopen:");
		exit(-1);
	}

	char buffer[256] = { 0 };
	char * res = fgets(buffer , 7 , fp);
	if (res == NULL) {
		perror("fgets:");
		exit(-1);
	}
	fputs(buffer , stdout);

	fclose(fp);
	fp = NULL;


	return 0;
}

5.fprintf

函数原型:

int fprintf( FILE *stream, const char *format [, argument ]...);
  • FILE *stream 输出流
  • const char *format [, argument ]... 格式化数据和 printf 用法类似

例:

#include 
#include 

typedef struct Data {
	int order;
	double score;
}Data;

int main() {

	Data data = { 1 , 100 };
	FILE* fp = fopen("D:/test.txt", "w");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fprintf(fp , "%d %lf" , data.order , data.score);

	fclose(fp);
	fp = NULL;


	return 0;
}

C语言文件打开关闭详解、文件顺序读写详解。_第1张图片


6.fscanf

函数原型:

int fscanf( FILE *stream, const char *format [, argument ]... );
  • FILE *stream 输入流
  • const char *format [, argument ]... 格式化数据和 scanf 用法类似
  • int fscanf 读取成功返回读入的参数的个数,失败返回 EOF

例:

#include 
#include 

typedef struct Data {
	int order;
	double score;
}Data;

int main() {

	Data temp = { 0 };
	FILE* fp = fopen("D:/test.txt", "r");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fscanf(fp , "%d %lf" , &temp.order , &temp.score);
	fprintf(stdout , "%d %lf", temp.order, temp.score);

	fclose(fp);
	fp = NULL;

	return 0;
}

C语言文件打开关闭详解、文件顺序读写详解。_第2张图片


7.fwrite

函数原型:

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
  • const void *buffer 指向要写入数据的指针
  • size_t size 每个元素的字节大小
  • size_t count 写入元素的个数
  • FILE *stream 文件流

例:

#include 
#include 

typedef struct Data {
	char name[20];
	int order;
}Data;

int main() {

	Data data = { "孙悟空" , 1 };
	FILE* fp = fopen("D:/test.txt", "wb");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fwrite(&data , sizeof(data) , 1 , fp);

	fclose(fp);
	fp = NULL;

	return 0;
}

8.fread

函数原型:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
  • void *buffer 这是指向一个存放读取到的数据的指针。
  • size_t size 每个元素的字节大小
  • size_t count 读入元素的个数
  • FILE *stream 文件流
  • size_t fread 返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于 count

例:

#include 
#include 

typedef struct Data {
	char name[20];
	int order;
}Data;

int main() {

	Data temp = { 0 };
	FILE* fp = fopen("D:/test.txt", "rb");
	if (!fp) {
		perror("fopen:");
		exit(-1);
	}

	fread(&temp, sizeof(temp), 1, fp);
	printf("%s %d" , temp.name , temp.order);

	fclose(fp);
	fp = NULL;

	return 0;
}

你可能感兴趣的:(c语言,开发语言,文件操作)