C语言学习历程(6)——文件编程

文件的概念

文件是系统资源(内存、硬盘、一般设备、进程间通信的通道等)的一个抽象,对系统资源进行访问的一个通用接口。
采用这种“文件”的方式有什么好处?
对资源提供通用的操作接口,可以极大地简化系统编程接口的设计。

常见的文件类型(可以通过文件来访问的系统资源)有:

普通文件:一般意义上的文件,作为数据存储在磁盘中,可以进行随机访问。Linux系统中的文件是面向字节的,文件的内容以字节为单位进行存储和访问。 
目录:目录是一种特殊的文件,目录可以像普通文件一样打开、关闭以及进行相应的操作。
管道:管道是Linux中的一种进程间通信的机制。
设备文件:设备文件没有具体的内容,对设备文件的读写操作实际上与某个设备的输入输出操作关联在一起。 
符号链接:符号链接的内容是指向另一个文件的路径。当对符号链接进行操作时,系统会根据情况将这个操作转移到它所指向的文件上去,而不是对它本身进行操作。
socket:socket也是一种进程间通信的方式,与管道不同的是,它们可以在不同的主机上进行通信,也就是网络通信。 
 

不带缓存的文件 I/O 操作

主要用到6个函数——creat、open、read、write、lseek和close。
这里的不带缓冲指每一个函数都只调用系统的一个函数。

使用方法:



#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main()
{
	int fd = open("test1",O_RDWR | O_CREAT,S_IRWXU);
	if(-1 == fd)
	{
		perror("open");
		return 1;
	}

	char* str = "123456";
	int count1 = write(fd,str,strlen(str));
	if(-1 == count1)
	{
		perror("write");
		close(fd);
		return 2;
	}

	lseek(fd,0,SEEK_SET);//将文件指针移动到文件开头

	char buffer[1024];
	int count2 = read(fd,buffer,1024);
	if(-1 == count2)
	{
		perror("read");
		close(fd);
		return 3;
	}

	printf("count2 = %d\n",count2);
	printf("buffer = %s\n",buffer);

    return 0;
}

带缓存的文件 IO 操作(标准IO) 

1、文件IO就指的是我们当前在讲的open、close、write、read等API函数构成的一套用来读写文件的体系,这套体系可以很好的完成文件读写,但是效率并不是最高的。【来回调用需要时间】
2、应用层C语言库函数提供了一些用来做文件读写的函数列表,叫标准IO。标准IO由一系列的C库函数构成(fopen、fclose、fwrite、fread),这些标准IO函数其实是由文件IO封装而来的(fopen内部调用的还是open,fwrite内部还是通过write来完成文件写入的)。
3、系统调用要请求内核的服务,会引发CPU模式的切换,期间会有大量的堆栈数据保存操作,开销比较大。然而,标准IO加了封装之后主要是在应用层添加一个缓冲机制,这样我们通过fwrite写入的内容不是直接进入内核中的buf,而是先进入应用层标准IO库自己维护的buf中,然后标准IO库将多个读写操作可以合并为一次系统调用,减少了系统调用的次数,大大提高了程序的运行效率。
4、标准I/O函数并不直接操作文件描述符,而是使用文件指针。文件指针和文件描述符是一一对应的关系,这种对应关系由标准I/O库自己内部维护。文件指针指向的数据类型为FILE型,但应用程序无须关心它的具体内容。在标准I/O中,一个打开的文件称为流(stream),流可以用于读(输入流)、写(输出流)或读写(输入输出流)。每个进程在启动后就会打开三个流,分别对应:stdin(标准输入流)、stdout(标准输出流)以及stderr(标准错误输出流)。因此,函数scanf()使用stdin,而函数printf()使用stdout。


#include <stdio.h>
#include <string.h>

int main()
{
	FILE* file = fopen("test2.txt","a+");
	if(NULL == file)
	{
		perror("fopen");
		return 1;
	}

	char* str = "helloworld";
	fprintf(file,"casjhcb\r\n");
	int count = fwrite(str,sizeof(char),strlen(str),file);
	if(EOF == count)
	{
		perror("fwrite");
		return 2;
	}

	fseek(file,0,0);

	char buffer[1024] = {0};
	int count1 = fread(buffer,sizeof(char),1024,file);
	if(EOF == count1)
	{
		perror("fread");
		return 3;
	}

	printf("fread : %s\n",buffer);

	fclose(file);

    return 0;
}


 
 


 

猜你喜欢

转载自blog.csdn.net/Neptune__/article/details/81707832