文件操作,及文件操作时的权限设置,快速实现文件拷贝,C语言常用IO函数

定义一个文件类型指针。用于保存打开文件后的指针。

C语言中可以用 gets(char *str) 来输入一行(包括空格)。

FILE *p = fopen("文件名",“打开的权限”);

其中权限可以是w ,此时如果文件不存在会自动创建,如果存在就会自动覆盖(内容);

权限也可以 r ,可以对文件中的内容进行读取。为r时文件必须存在,不存在打开则会失败,返回NULL。

r+ ,对文件可读写,但是只要有r,文件就必须存在。

rb+ , 不加b按文本文件的方式来读文件,

加b按二进制的方式来读文件,windows系统中,文本模式下,文件以 "\r\n"结尾 ,如果用fputs将“\n”写入文件时,会自动在前面加个\r变成 “\r\n” ,而linux等unix系统下,是否加b不影响,即没有区别。

w+ ,打开可读写文件,若文件存在则文件长度清0,即该文件内容会消失。若文件不存在则建立该文件。

a+

权限 a ,以追加方式添加文本。如果文件不存在那么就创建这个文件,如果文件存在就在文件结尾处开始追加。

feof( FILE *p),判断是否到了文件尾。

fputs(*str, FILE);   将字符串写入文件中。

fgets(char * str , sizeof(str), p) ; 读取 str大小的内容到字符串中。


从文件指针中读取一个字符 

ch = getc(p) ;

读出文件中所有内容

while( (ch = getc(p)) != EOF)
{
     printf("%c",ch);
} 
将一个字符写入文件

putc(ch ,p) ;

打开文件后要用 fclose(p) ,关闭文件指针。

feof(p) ;  判断是否已经到了文件结尾。如果到了,则返回真。

要读取文件中所有内容

while( !feof(p))
{
	memset(s,0,sizeof(s));		
	fgets(s,sizeof(s),p);
}


文件内容复制:

	FILE * p1 = fopen("D:\\a.txt","r");
	FILE * p2 = fopen("D:\\cp.txt","w");
	char buf[1024] ;
	while(!feof(p1))
	{
		memset(buf,0,sizeof(buf));
		fgets(buf,sizeof(buf),p1);
		fputs(buf,p2);
	}
	fclose(p1);
	fclose(p2);


普通文件加密:

在每次从文件从读出一行到buf后,调用加密函数。

code(char * str)
{
	while(*str)
	{
		(*s)++ ;
		s++;
	}
}
二进制文件加密:

code函数中要加入一个length,因为可能传入的参数可能不是一个字符串

C语言常用IO函数:

scanf    printf

sscanf   sprintf

fscanf    fprintf   // fscanf 与scanf用法基本一致,fscanf是从一个文件读取输入。

fscanf(FILE * p, "%s",buf) ; 可以以解析文件中固定格式的字符。

fscanf(FILE * p ,"%d + %d",&a,&b); 即能将文件中 a1 + b1 中a1和b1的值存入a,b。

fprintf(FILE *p ,"%s",buf) ; 将buf中的字符全部输出到文件中。(即写入到文件)


getc     putc   //只能对文本文件进行操作。

图片,视频以及word文件都是二进制文件。

要操作二进制文件。可以使用 fread 和 fwrite,如果使用它们,而打开的时候不加b ,则导致读出的文件大小缺失。(windows下必须要写,linux下则可写可不写);

fread(buf, sizeof(char), ARTsize , p)  

fread(buf, sizeof(char), sizeof(buf)-1,p) //按照字节数进行读写。如果第三个参数不减1,打印buf的时候将出现乱码,原因时\r\n为换行符。 如果buf的大小大于文件中有的大小,则拷贝二进制文件时会出错(因为新的文件的大小为buf大小大于原二进制文件的大小)

解决办法:

size_t  res = fread(buf, sizeof(char), sizeof(buf), p1);   //返回读出的字节数。

fwrite(buf, sizeof(char), res , p2 ) ;   //  返回多少字节就写进去多少字节

stat函数。 在 <sys/stat.h>头文件中。结构体类型 stat 里可以保存文件的各种信息。

使用方式:

struct stat st ={0} ; 定义一个结构
stat("D:\\a.txt",&st); //调用完stat函数后,文件的属性就保存在了 st结构体中。
例如现在就可以打印出a.txt文件的大小。  
printf("%d",st.st_size) ;

这样当一个要拷贝的文件特别大时,为了提高拷贝速率,可以在堆内存中生气一个内存空间来拷贝。

char * array = malloc(st.st_size) ;
FILE * p = fopen("D:\\b.txt","rb");
fread(array, sizeof(char), st.st_size, p);  相当于将文件内容一次性读到堆空间中
fclose(p) ;
然后再调用fwrite将 array写入另一个文件即完成拷贝。
还可以将结构体写入文件,或者将文件中的内容写入结构体。


对一系列字符串(里面存的数字)进行排序并输出:

int array[512] = {0};
while(!feof(p))
{
	char buf[100] = {0};
	fgets(buf,sizeof(buf),p); 读取文件中的一行到字符数组中
	if(buf[0] != 0)   //如果不加此处,文件如果有空行的话在下面atoi转换时将会转化成0这个值并记录。
	{
		int value = atoi(buf) ; //默认字符串里全是 0-512之间的字符。
		array[value]++ ; 记录值为value所出现的次数。
	}
}
for(int i =0 ; i<512; i++)    
{
	for(int j=0; j<array[i]; j++)
		printf("%d",i);
}
可以通fseek调整文件指针的位置。

fseek(FILE *p, sizeof(struct student), SEEK_END);  //第二个参数为偏移量。

SEEK_SET  实际上定义了宏  0

SEEK_CUR      1

SEEK_END       2

ftell用于得到文件位置指针相对于文件首的偏移字节数。

long  len = ftell( FILE * p) ;

程序通过C语言函数库往文件里面写数据时,并不是实时将数据直接写入磁盘,而是放到内存里面,当内存满了或者明确的调用了fclose,才将数据一次性写入磁盘。 C语言的文件操作函数都是缓冲区函数。

而通过每次写完后,调用fflush(FILE * p) ;数据就会实时进入文件。

好处:停电,电脑死机等故障导致缓冲区的内容丢失。

不好:硬盘读写次数增加,导致程序效率低下,同时硬盘寿命变短。

//修改配置文件的时候,有时候会使用,或者做一些不经常修改的数据,但很重要数据,那么就需要用fflush.

删除文件 remove("D\\a.txt")  ;即删除文件。

文件改名rename("D:\\a.txt","D:\\m.txt") ; 将D盘中的文件a.txt改名为m.txt;

getchar  putchar

fgets   fputs

fgetc    fputc




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值