Chinaunix首页 | 论坛 | 博客
  • 博客访问: 87065
  • 博文数量: 66
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-18 09:34
文章分类
文章存档

2012年(66)

我的朋友

分类:

2012-07-26 11:13:47

原文地址:标准c语言库读写文件 作者:fly123456789

先看看这个函数:WV9平坦软件园

fopen(打开文件)WV9平坦软件园

相关函数 WV9平坦软件园

openfcloseWV9平坦软件园

表头文件 WV9平坦软件园

#includeWV9平坦软件园

定义函数 WV9平坦软件园

FILE * fopen(const char * path,const char * mode);WV9平坦软件园

函数说明 WV9平坦软件园

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。WV9平坦软件园
mode有下列几种形态字符串:WV9平坦软件园
r
打开只读文件,该文件必须存在。WV9平坦软件园
r+ 打开可读写的文件,该文件必须存在。WV9平坦软件园
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。WV9平坦软件园
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。WV9平坦软件园
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。WV9平坦软件园
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。WV9平坦软件园
上述的形态字符串都可以再加一个b字符,如rbw+bab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。WV9平坦软件园

返回值 WV9平坦软件园

文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。WV9平坦软件园

附加说明 WV9平坦软件园

一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。WV9平坦软件园

范例 WV9平坦软件园

#includeWV9平坦软件园
main()WV9平坦软件园
{WV9平坦软件园
FILE * fp;WV9平坦软件园
fp=fopen("noexist","a+");WV9平坦软件园
if(fp= =NULL) return;WV9平坦软件园
fclose(fp);WV9平坦软件园
}
WV9平坦软件园

fread(从文件流读取数据)WV9平坦软件园

相关函数 WV9平坦软件园

fopenfwritefseekfscanfWV9平坦软件园

表头文件 WV9平坦软件园

#includeWV9平坦软件园

定义函数 WV9平坦软件园

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);WV9平坦软件园

函数说明 WV9平坦软件园

fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()ferror()来决定发生什么情况。WV9平坦软件园

返回值 WV9平坦软件园

返回实际读取到的nmemb数目。WV9平坦软件园

附加说明 WV9平坦软件园

 

范例 WV9平坦软件园

#includeWV9平坦软件园
#define nmemb 3WV9平坦软件园
struct testWV9平坦软件园
{WV9平坦软件园
char name[20];WV9平坦软件园
int size;WV9平坦软件园
}s[nmemb];WV9平坦软件园
main()WV9平坦软件园
{WV9平坦软件园
FILE * stream;WV9平坦软件园
int i;WV9平坦软件园
stream = fopen("/tmp/fwrite","r");WV9平坦软件园
fread(s,sizeof(struct test),nmemb,stream);WV9平坦软件园
fclose(stream);WV9平坦软件园
for(i=0;iWV9平坦软件园

printf("name[%d]=%-20s:size[%d]=%d/n",i,s[i].name,i,s[i].size);WV9平坦软件园
}WV9平坦软件园

执行 WV9平坦软件园

name[0]=Linux! size[0]=6WV9平坦软件园
name[1]=FreeBSD! size[1]=8WV9平坦软件园
name[2]=Windows2000 size[2]=11
WV9平坦软件园

fwrite(将数据写至文件流)WV9平坦软件园

相关函数 WV9平坦软件园

fopenfreadfseekfscanfWV9平坦软件园

表头文件 WV9平坦软件园

#includeWV9平坦软件园

定义函数 WV9平坦软件园

size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);WV9平坦软件园

函数说明 WV9平坦软件园

fwrite()用来将数据写入文件流中。参数stream为已打开的文件指针,参数ptr 指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定。Fwrite()会返回实际写入的nmemb数目。WV9平坦软件园

返回值 WV9平坦软件园

返回实际写入的nmemb数目。WV9平坦软件园

范例 WV9平坦软件园

#includeWV9平坦软件园
#define set_s (x,y) {strcoy(s[x].name,y);s[x].size=strlen(y);}WV9平坦软件园
#define nmemb 3WV9平坦软件园
struct testWV9平坦软件园
{WV9平坦软件园
char name[20];WV9平坦软件园
int size;WV9平坦软件园
}s[nmemb];WV9平坦软件园
main()WV9平坦软件园
{WV9平坦软件园
FILE * stream;WV9平坦软件园
set_s(0,"Linux!");WV9平坦软件园
set_s(1,"FreeBSD!");WV9平坦软件园
set_s(2,"Windows2000.");WV9平坦软件园
stream=fopen("/tmp/fwrite","w");WV9平坦软件园
fwrite(s,sizeof(struct test),nmemb,stream);WV9平坦软件园
fclose(stream);WV9平坦软件园
}
WV9平坦软件园

而文件的定位很少有帖子写到。比如说把一个源文件拷贝成另外的10个目标文件,则每次拷贝完一个目标文件后都要对源文件重新定位。从文件开头开始重新读取文件,然后再写文件。WV9平坦软件园

ret = fseek(sourcefp , 0 ,SEEK_SET );WV9平坦软件园

if (ret <0)WV9平坦软件园

{WV9平坦软件园

         perror("pointer fail/n");WV9平坦软件园

         exit(0);WV9平坦软件园

}WV9平坦软件园

还有另外一个问题,就是如何得到文件结束的标志。如何判断文件已经读完了,已经读到文件尾部。我试验了下,这个还是最精确的。WV9平坦软件园

//read the source fileWV9平坦软件园

while(!feof(sourcefp))WV9平坦软件园

{WV9平坦软件园

         buf_len = fread(data,sizeof(unsigned char),sizeof(data),sourcefp);WV9平坦软件园

         fwrite(data,1,buf_len,desfp);WV9平坦软件园

}WV9平坦软件园

feof来确定文件已经读到尾部。跳出循环。WV9平坦软件园

一下是我写的一个小程序,把1.rmvb复制成2000份,分别复制成2.rmvb3.rmvb、、、2000.rmvb。完整程序如下:(见笑)WV9平坦软件园

 WV9平坦软件园

#include WV9平坦软件园

#include WV9平坦软件园

#include WV9平坦软件园

#include WV9平坦软件园

#include WV9平坦软件园

 WV9平坦软件园

#define FILENUM 2000WV9平坦软件园

#define FILENAME ("1.rmvb")WV9平坦软件园

 WV9平坦软件园

int main(int argc , char * argv[])WV9平坦软件园

{WV9平坦软件园

         int i;//countWV9平坦软件园

         FILE * sourcefp;//resource fileWV9平坦软件园

         FILE * desfp;//destination fileWV9平坦软件园

         char tempfilename[20];// temp file nameWV9平坦软件园

         char data[10240];WV9平坦软件园

         int count=2;//file countWV9平坦软件园

         int ret;//ce shi usedWV9平坦软件园

         int buf_len;//buf lengthWV9平坦软件园

         WV9平坦软件园

         //open the resource fileWV9平坦软件园

         sourcefp = fopen(FILENAME , "a+");WV9平坦软件园

         if (sourcefp == NULL)WV9平坦软件园

         {WV9平坦软件园

                   perror("open file fail/n");WV9平坦软件园

                   //exit(0);WV9平坦软件园

         }WV9平坦软件园

         WV9平坦软件园

         for(i=2 ;i<=FILENUM ;i++)WV9平坦软件园

         {WV9平坦软件园

                   //filenameWV9平坦软件园

                   memset(tempfilename , 0 ,sizeof(tempfilename));WV9平坦软件园

                   bzero(tempfilename , sizeof(tempfilename));WV9平坦软件园

                   sprintf(tempfilename , "%d.rmvb" ,count);WV9平坦软件园

                   count++;//count addWV9平坦软件园

                   WV9平坦软件园

                   //open destination fileWV9平坦软件园

                   desfp = fopen(tempfilename , "ab+");WV9平坦软件园

                   if (desfp == NULL )WV9平坦软件园

                   {WV9平坦软件园

                            printf("open file %d.rmvb fail ",count);WV9平坦软件园

                            continue;//if fail continue;WV9平坦软件园

                   }WV9平坦软件园

                   printf("%d个文件开始复制.../n",count);WV9平坦软件园

                   //point the pointer to the file headWV9平坦软件园

                   ret = fseek(sourcefp , 0 ,SEEK_SET );WV9平坦软件园

                   if (ret <0)WV9平坦软件园

                   {WV9平坦软件园

                            perror("pointer fail/n");WV9平坦软件园

                            exit(0);WV9平坦软件园

                   }WV9平坦软件园

                   WV9平坦软件园

                   //read the source fileWV9平坦软件园

                   while(!feof(sourcefp))WV9平坦软件园

                   {WV9平坦软件园

                            buf_len = fread(data,sizeof(unsigned char),sizeof(data),sourcefp);WV9平坦软件园

                            fwrite(data,1,buf_len,desfp);WV9平坦软件园

                   }WV9平坦软件园

                   WV9平坦软件园

                   //close temp file pointWV9平坦软件园

                   printf("%d个文件复制完毕/n",count);WV9平坦软件园

                   fclose(desfp);  WV9平坦软件园

                   printf("%s/n" ,tempfilename);       WV9平坦软件园

         }WV9平坦软件园

         WV9平坦软件园

         fclose(sourcefp);WV9平坦软件园

         printf("%s" , FILENAME);WV9平坦软件园

         return 0;WV9平坦软件园

}WV9平坦软件园

 WV9平坦软件园

完成。在linux下编译通过
阅读(363) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~