C文件

文件流分为磁盘文件、标准输入输出文件等。 文件流的基本操作是读写,磁盘文件文件还支持定位。

文件流函数和结构

代码 类型 说明
FILE 结构 文件流结构
EOF 表示文件结束
stdin 标准输入文件,键盘
stdout 标准输出文件,屏幕文本
stderr 标准错误文件,屏幕文本
FILE* fopen(char* path,char* mode) 函数 打开文件
void fclose(FILE* f) 函数 关闭文件
void fflush(FILE* f) 函数 将输出流的缓存刷新到文件。
size_t fputs(char* ch,FILE* f) 函数 以字符的方式写文件
char* fgets(char* ch,int max_size,FILE* f,) 函数 以字符的方式读文件
size_t sprintf(FILE* f,char* format,...) 函数 以字符的方式格式化写文件。
size_t fwrite(void* b,size_t size,size_t size,FILE* f) 函数 以字节的方式写文件
size_t fread(char* ch,size_t max_size,FILE* f,) 函数 以字节的方式读文件
size_t ftell(FILE* f) 函数 返回文件读取位置。
SEEK_CUR 从当前位置开始定位。
SEEK_END 从结束位置开始定位。
SEEK_SET 从开始位置开始定位。
int fseek(FILE* f,long offset,int orign) 函数 定位文件。

打开方式

模式 说明
r 只读,文件必须存在
w 只写,文件不存在则新建,否则截断文件。
a 追加只写,文件不存在则新建,否则打开文件。
r+ 读写,文件必须存在。
w+ 读写,文件不存在则新建,否则截断文件。
a+ 读追加写,文件不存在则新建,否则打开文件。
t 以文本的方式操作文件,不写默认为t
b 以字节(二进制)的方式操作文件

以字符方式读写文件

FILE* f = fopen("hello.txt","w+");
char buffer[512];

if(f)
{
    fputs("hello\n",f);

    fseek(f, 0, SEEK_SET);//定位文件到开头

    fgets(buffer, 512, f);
    fclose(f);
}

以字节的方式读写文件

FILE* f = fopen("hello.dat", "w+");

if (f)
{
	int i = 1234567;
	float j = 3.1415926;
	char s[] = "hello!";
	int size = strlen(s);

	fwrite(&i, sizeof(i), 1, f);
	fwrite(&j, sizeof(j), 1, f);

	//写入长度和对于字符串
	fwrite(&size, sizeof(size), 1, f);
	fwrite(s, size, 1, f);

	fseek(f, 0, SEEK_SET);

	int i2;
	float j2;
	int size2;

	fread(&i2, sizeof(i2), 1, f);
	fread(&j2, sizeof(j2), 1, f);

	printf("%d,%f\n", i2, j2);

	//读取长度
	fread(&size2, sizeof(size2), 1, f);

	//读取对应长度字符串
	if (size2 >= 0) {
		char* s2 = (char*)malloc(size2 + 1);
		if (s2)
		{
			memset(s2, 0, size2 + 1);//额外长度存放\0
			fread(s2, size2, 1, f);
			printf("%s\n", s2);
			free(s2);
		}
	}

	fclose(f);
}

两种读写方式比较

以字符方式读写操作简单,便于查看,但更浪费空间。

以字节方式操作复杂,不便宜直接查看,但更节约空间。

字符流和字节流的区别

计算机是以字节的方式存储数据的,字符流是一种特殊的字节流,它经过了文字编码。

对于C语言,char类型是英文一般是ascii,中文是gb2312编码。

如果了解字符编码,可以以字节的方式读取字符流,并进行解码。

但如果以字符方式读取字节流,却是不可以的,字节流是开发者自行设计的格式,不是字符编码。

获取文件大小

通过定位和返回当前位置,可以获取文件大小。

FILE* f = fopen("hello.dat", "r");

if (f)
{
	fseek(f, 0, SEEK_END);
	int size = ftell(f);
	printf("file size:%d\n", size);
	fclose(f);
}

标准输入输出流的读写

可以使用字符读标准输入流,字符方式写输出流。


fputs("请输入文字:",stdout);

char buffer[256]={0};

fgets(buffer,256,stdin);

fprintf(stdin,"你输入的是:%s\n",buffer);

fflush(stdin);

更多的文件操作

C标准库只定义了标准的读写操作,更多的判断文件是否存在、枚举文件和文件夹、删除、文件信息等操作需要使用对于操作系统的API。