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 <stdio.h>
#include <stdlib.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdlib.h>
#include <stdio.h>

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 <stdio.h>
#include <stdlib.h>

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;
}

在这里插入图片描述


6.fscanf

函数原型:

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

例:

#include <stdio.h>
#include <stdlib.h>

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;
}

在这里插入图片描述


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 <stdio.h>
#include <stdlib.h>

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 <stdio.h>
#include <stdlib.h>

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;
}
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值