总结文件操作函数(一)-C语言

在进程一開始执行,就自己主动打开了三个相应设备的文件。它们是标准输入、输出、错误流。分别用全局文件指针stdin、stdout、stderr表示,相应的文件描写叙述符为0。1。2stdin具有可读属性,缺省情况下是指从键盘的读取输入,stdout和stderr具有可写属性,缺省情况下是指向屏幕输出数据。


将文件路径转化为文件指针:

#include <stdio.h>  //头文件包括

FILE *fopen(const char *pach,const char *mode);  //文件名称  模式

int fclose(FILE *stream);

fopen以mode的方式打开或创建文件,假设成功。将返回一个文件指针,失败则返回NULL.

fopen创建的文件的訪问权限将以0666与当前的umask结合来确定。 

在Linux系统中,mode里面的’b’(二进制)能够去掉。可是为了保持与其它系统的兼容性。建议不要去掉。ab和a+b为追加模式,在此两种模式下,不管文件读写点定位到何处。在写数据时都将是在文件末尾加入,所以比較适合于多进程写同一个文件的情况下保证数据的完整性。一般使用r或者w模式。

将文件夹名转化为文件夹指针:

#include <sys/types.h>

#include <dirent.h>

DIR *opendir(const char *name); //打开一个文件夹,返回一个DIR类型的指针

struct dirent *readdir(DIR *dir); //读取文件夹的一项信息,并返回该项信息的结构体指针

void rewinddir(DIR *dir); //又一次定位到文件夹文件的头部

int closedir(DIR *dir); //关闭文件夹文件

读取文件夹信息的步骤为:

用opendir函数打开文件夹;

使用readdir函数迭代读取文件夹的内容,假设已经读取到文件夹末尾。又想又一次開始读,则能够使用rewinddir函数将文件指针又一次定位到文件夹文件的起始位置。

用closedir函数关闭文件夹

opendir()用来打开參数name指定的文件夹,并返回DIR*形态的文件夹流,文件操作函数open()类似,接下来对文件夹的读取和搜索都要使用此返回值。函数失败则返回NULL

 

 

 

在字符串读取和写入的时候以及格式化输入输出时经经常使用到文件指针:

Char buf[1024];

char *fgets(char *s, int size, FILE *stream);

int fputs(const char *s, FILE *stream);

fgets和fputs从文件流stream中读写一行数据;当文件指针为stdin/stdout分别表示从标准输入流和输出流 输入和输出。

此时类似于gets和puts函数

fgets能够指定目标缓冲区的大小,读取文件的时候size大于该行的字符总数加2(多出来的两个。一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0')。文件并不会继续读下去,只不过这一行读取完。随后指向文件的指针会自己主动偏移至下一行。

此时buf[strlen(buf)-1]里存放的是'\n'

用char*则要用malloc分配内存

fputs不会在行尾自己主动加入换行符。可是puts会在标准输出流中自己主动加入一换行符。

 

对二进制形式的依照读写:

函数原型:

size_t  fread(void  *buffer,size_t  size, size_t  count,  FILE   *fp);

size_t  fwrite(void  *buffer,size_t  size, size_t  count,  FILE   *fp);

功能:读/写数据块fread与fwrite 一般用于二进制文件的输入/输出

fread:从fp所指向的文件里读取count个块,每一个块的长度为size个字节,存放到以buffer为首地址的内存中。当中buffer必须已经是由内存空间的。

fwrite:从以buffer为首地址的内存中读取count个块。每一个块的长度为size个字节,写入到fp所指向的文件里。

返回值:成功,返回读/写的块数;出错或文件尾。返回0

说明:

buffer:   指向要输入/输出数据块的首地址的指针

size:   读/写的数据块的大小(字节数)

count:   要读/写的数据块的个数

fp:     要读/写的文件指针

范例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct STUDENT
{
		char sNo[5];
		char sName[20];
		double score;
}STUDENT;
void main()
{    /* 操作一块 */
		STUDENT stu[3] = {{"0001", "赵军", 89},{"0002", "李千", 90},{"0003", "张芳", 100}
		};
		STUDENT stu2;
		FILE* fp = fopen("d:\\b.txt", "wb+");//写打开。转化为文件指针
		if(NULL == fp)
		{
			printf("Can not open this file!\n");
			exit(0);
		}
		fwrite(stu, sizeof(STUDENT), sizeof(stu)/sizeof(STUDENT), fp);
		rewind(fp);	/* 文件指针又一次回到头 */
		fseek(fp, sizeof(STUDENT), SEEK_SET); /* 定位,此处跳过一条记录 */
		fread(&stu2, sizeof(STUDENT), 1, fp); /* 从文件里读取指定大小的块 */
		printf("%s-->%s-->%lf\n", stu2.sNo, stu2.sName, stu2.score);
		fclose(fp);
}



posted @ 2017-04-26 10:34  lytwajue  阅读(187)  评论(0编辑  收藏  举报