一篇入门C语言【文件】

发布于:2024-09-05 ⋅ 阅读:(10) ⋅ 点赞:(0)

本科期间C语言的课本无论哪个版本都会有【文件】这一章节,不过好多学校基本上不讲或者就出一道选择题,讲得很浅,今天这篇详细总结一下这部分的知识~

一.原理解析

        文件是指存在在外部介质(如磁盘、磁带)上的数据集合。操作系统是以文件为单位对数据进行管理的~(这是408的常识。)

        程序执行时就称为进程,进程运行中的数据均存在内存中。需要存储运算后的数据时,就需要使用文件。这样程序下次启动后,就可以直接从文件中读取数据~

C语言对文件的处理方式如下:

  • 缓冲文件系统:系统自动在内存区为每一个正在使用的文件开辟一个缓冲区,用缓冲文件系统进行的输入、输出称为高级磁盘输入、输出。
  • 非缓冲文件系统:系统不自动开辟确定大学的缓冲区,而由程序为每个文件设定缓冲区,对应低级输入、输出。

缓冲区的原理:本质即为一段内存空间

  • 全缓冲:磁盘文件的读写操作
  • 行缓冲:遇到换行符才执行IO操作
  • 不带缓冲

(意义在于提高对文件的读写效率)

flie类型,看一下成员变量即可~ 

(不同系统和编译器的成员变量可能会有差异) 

我们通过文件指针来访问文件类型的变量~ 

二.文件打开及关闭

有关【流】的说法,指的就是指向文件的指针~

文件打开失败的情形:

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

int main(int argc, char *argv[]) {
	
	FILE* fp;//file类型的指针
	fp=fopen("file.txt","r");
	if(fp==NULL){
			perror("fopen"); 
			return -1; 
	} 
	return 0;
}

文件必须和可执行成程序在同一目录下:这样再执行上述代码就不会报错~

在文件中键入任意字符:

 通过fgetc可以获取第一个字符并输出:

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

int main(int argc, char *argv[]) {
	
	FILE* fp;//file类型的指针
	fp=fopen("file.txt","r");
	char c;
	c=fgetc(fp);
	printf("%c",c); 
	return 0;
}

用循环将文件中的字符全部输出:

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

int main(int argc, char *argv[]) {
	
	FILE* fp;//file类型的指针
	fp=fopen("file.txt","r");
	char c;
	while((c=fgetc(fp))!=EOF)
		printf("%c",c); 
	return 0;
}

修改代码,再向目标文件中写入“ABCDEFG”:(注意,权限要修改为“r+”,即允许写入)

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

int main(int argc, char *argv[]) {
	
	FILE* fp;//file类型的指针
	fp=fopen("file.txt","r+");
	char c;
	while((c=fgetc(fp))!=EOF)
		printf("%c",c); 
	char i;
	for(i='A';i<='G';i++)
		c=fputc(i,fp);
	return 0;
}

博主已经执行了两次代码,如下图: (顺便提一句,r+是以文本的方式打开文件的~

由于文件指针是自移的,所以再执行一遍,上述字符会全部输出:

并且再度多一倍:

 (用Visual的话要分开读写操作!)

三.文件读写

上述两个只能操作一个字符,下面介绍批量操作的。

把之前file.txt里面的字符全部清空,然后执行下面的代码:

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

int main(int argc, char *argv[]) {
	
	char buf[32]="Jsl and Hyh~";
	FILE* fp;//file类型的指针
	int ret;//函数返回值 
	fp=fopen("file.txt","r+");
	
	ret=fwrite(buf,sizeof(char),12,fp);
	fclose(fp); 

}

字符写入文件:

需要注意一个细节,由于windows的设计,各位在以文本方式写入后,必须以文本方式读出,不然可能会有字节上的些许差异:

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

int main(int argc, char *argv[]) {
	
//	char buf[32]="Jsl and Hyh~";
	FILE* fp;//file类型的指针
	int ret;//函数返回值 
	fp=fopen("file.txt","r+");
//	
//	ret=fwrite(buf,sizeof(char),12,fp);
	
	char buf1[32]={0};
	ret=fread(buf1,sizeof(char),32,fp);
	printf("%s",buf1); 
	fclose(fp); 

}

 

 fgets和fputs同理,不过只能用于文本文件~

四.位置指针偏移

人工控制位置指针的方式:

代码如下:

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

int main(int argc, char *argv[]) {
	
	char buf[32]="Jsl and Hyh~";
	FILE* fp;//file类型的指针
	int ret;//函数返回值 
	int pos;
	fp=fopen("file.txt","r+");

	fwrite(buf,sizeof(char),12,fp);//写完以后无法直接读取字符串
	
	ret=fseek(fp,-5,SEEK_CUR); 
	pos=ftell(fp);
	char buf1[32]={0};
	fread(buf1,sizeof(char),32,fp);
	printf("%s",buf1);

	fclose(fp); 

}

非常完美!


网站公告

今日签到

点亮在社区的每一天
去签到