linux应用编程笔记(6)库函数方式实现文件复制编程

摘要:介绍了库函数文件编程常用的函数,打开,关闭,写,读,定位等,最后通过一个实例将这些函数都运用了一边,加深理解。


一、库函数文件编程常用函数

    1.fopen(打开文件)
    头文件 #include<stdio.h>
    定义函数 FILE * fopen(const char * path,const char * mode);
    函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

    mode有下列几种形态字符串:
    r 打开只读文件,该文件必须存在。
    r+ 打开可读写的文件,该文件必须存在。
    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
     a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
    a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。


    2.fclose(关闭文件)
    头文件 #include<stdio.h>
    定义函数 int fclose(FILE * stream);
    函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。
    返回值若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno

    3.fseek(移动文件流的读写位置)

    头文件#include<stdio.h>
    定义函数 int fseek(FILE * stream,long offset,int whence);
    函数说明 fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

    参数 whence为下列其中一种:
    SEEK_SET从距文件开头offset位移量为新的读写位置。

    SEEK_CUR以目前的读写位置往后增加offset个位移量。
    SEEK_END将读写位置指向文件尾后再增加offset个位移量。
    当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。
    下列是较特别的使用方式:
    1) 欲将读写位置移动到文件开头时:fseek(FILE*stream,0,SEEK_SET);
    2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);
    返回值 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。


    4.fwrite(将数据写至文件流)
    头文件 #include<stdio.h>
    定义函数 size_t fwrite(const void * ptr,size_t size,size_tnmemb,FILE * stream);
    函数说明 fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。
    返回值 返回实际写入的nmemb数目。


    5.fread(从文件流读出数据)

    头文件 #include<stdio.h>

    定义函数 size_tfread(void *buf, size_t size, size_t nmemb, FILE *stream);

    函数说明 fread()函数从stream指向的二进制文件中,读入nmemb个大小为size个字节的数据块到buf所指向的内存中。如果执行成功,则返回实际读取的数据块的个数。

    返回值 实际读取的nmemb的数目。

   

   6.fscanf

    int fscanf(FILE *fp, const char *mode,…);

    fscanf()函数与scanf()函数比较,格式中多了一个fp参数,其作用和意义基本相同,唯一不同的作用是后者将是从标准输入文件中,按指定格式逐个输入信息到指定的变量中;后者是从fp指向的文本文件中读取数据。

    函数的意义是:从fp指向的文件中,按mode中指定的格式逐个读取文本数据转换成指定的数据类型,附给对应指针指向的存储单元中。

 

   7.fprintf

    int fpintf(FILE *fp, char *mode,…);
    fprintf()函数与printf()函数比较,格式中多了一个fp参数,其作用和意义基本相同,唯一不同的作用是前者将输出的文本信息不是写入到标准输出文件中,而是写入到由fp指向的文件中。

    函数的意义是:将省略号表示的位置列出的表达式的值计算出来后,按mode中指定的格式输到有fp指向的文件中。

 

   8.fgetc

    int fgetc(FILE *fp);

    fgetc()函数是从句柄fp指向的文件当前位置读一个字符作为函数的返回值。

    另外,还有函数char *fgets(char *str, int n, FILE *fp)是从文件中读取最多n个字符到str指向存储单元。

    例如:

    c=fgetc(fp);

    从fp指向的文件当前位置读一个字符,并赋给变量c,并使文件指针下移一个字符。如果fp指向文件结束位置,则返回文件结束标志EOF(即为-1)。

 

   9.fputc

    int fputc(int ch , FILE *fp);

    fputc()函数是将字符ch直接写入句柄fp指向的文件的当前位置,如果出错则返回EOF。

    另外,还有函数int fputs(char *str, int n, FILE *fp),其作用类似与puts()函数。

 

二、利用上述函数编写程序实现文件复制功能

    还是要完成这个功能,需要以下几步:

    1.打开源文件。

    2.打开或者创建目标文件。

    3.读取源文件到buf。

    4.从buf里面写到目标文件。

    5.关闭源文件和目标文件。

    具体实现函数如下:

<span style="font-size:18px;">#include <stdio.h>

int main(int argc,char *argv[])
{
	FILE *fp1,*fp2;
	int count;
	char c;
	char buf[20];
	char buf_t[]={"hello world!"};
	
	if((fp1=fopen(argv[1],"r+"))==NULL)
		{
			printf("open source file eror!\n");	
		}

	if((fp2=fopen(argv[2],"w+"))==NULL)
		{
			printf("open target file eror!\n");	
		}
	
	while(count=fread(buf,1,1,fp1))
	{
		fwrite(buf,1,1,fp2);
		}
	printf("copy OK!\n");
	
	fseek(fp2,10,SEEK_SET);
	fwrite(buf_t,sizeof(buf_t),1,fp2);
	printf("fseek and rewrite down!\n");	
	
	fseek(fp2,-2,SEEK_END);
	c=fgetc(fp2);
	fseek(fp1,0,SEEK_END);
	fputc(c,fp1);
	
	fclose(fp1);
	fclose(fp2);


	return 0;	
}</span>

    该函数把text1.txt的内容拷贝到text2.txt,当然一开始text2.txt可以不存在,然后在text2.txt中,定位到开始后第十个字节处,写出buf_t中的内容,然后再读取text2.txt倒数第二个字节,并把它放到text1.txt的最后当中。

    步骤如下:

    #gcc filecp.c –o filecp

    #./filecp text1.txt text2.txt

    然后最后我们的结果如下:

    分别打开text1.txt和text2.txt得到的结果如下:

    text1.txt

   

    最后这个感叹号就是通过fgetc从2中读出来再fputc到它的末尾。

    text2.txt

   

    首先是复制过来成功,然后中间我在指定位置添加进去了一个hello world!

    程序也比较简单,可以自己对照着去看,最需要注意的就是文件的打开方式!!!这篇帖子就总结到这里,如有不正确的地方还请指出,大家共用进步!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值