Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1729|回复: 0
打印 上一主题 下一主题

文件操作

[复制链接]

1272

主题

2067

帖子

7958

积分

认证用户组

Rank: 5Rank: 5

积分
7958
跳转到指定楼层
楼主
发表于 2020-1-1 15:05:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
文件操作有以下几个内容:
  1.将数据从内存输出到文件上,也称“写”文件。
  2.将数据从文件输入到内存,也称“读”文件。
.怎样进行文件操作:
  1.设立文件指针
     进行文件操作时,必须在程序一开始就先定义文件指针。
         
     FILE *指针类型变量
  2.打开文件
     将文件指针与磁盘上的文件建立联系,以后对文件的所有操作都将通过文件指针来进行
   
          fopen(文件名, 使用文件方式)
          比如: fp = fopen("A.TXT","r");
      其中A.TXT表示将要访问的是当前盘当前路径下名为A.TXT的文件。
      
      fopen()函数调用成功,表示在指定的磁盘位置找到文件A.TXT,这时将带回指向A.TXT文件的指针并赋给 fp,这样fp就和文件A.TXT建立了联系。
     
      如果文件打开不成功,fopen()函数将返回一个空指针NULL,为了避免使用空指针,应该按下面的程序段 的书写形式输出失败信息:
  if( fp=fopen("A.TXT","r") == NULL)
     {
         printf("can't find this file!\n");
   exit(0);
     }
  
-------------------------------------------------------------------------------------------------
  
文件使用方式    含义
"r"(只读)       为输入打开一个文本文件。若指定的文件不存在,则会出错
"w"(只写)       为输出打开一个文本文件。若文件不存在,系统将用指定名建立一个新文件;若文件已经存            在,则将从起始位置重新写,原有内容被更新
"rb"(只读)      为输入打开一个二进制文件。功能与"r"相同
"wb"(只写)      为输出打开一个二进制文件。功能与"w"相同
"a"(追加)       为追加数据打开一个文本文件。若文件不存在,系统将用指定名建立一个新文件;若文件已  经存在,则新数据写在原有内容之后
"ab"(追加)      为追加数据打开一个二进制文件。其余功能与"a"相同
"r+"(读写)      为读/写打开一个已存在文本文件。既可读,也可写,读写总是从文件的起始位置开始;更换  读写操作时不必关闭文件
"rb+"(读写)     为读/写打开一个已存在的二进制文件。功能与"r+"相同。可由位置函数设置读写的起始位置
"w+"(读写)      为读/写建立一个新的文本文件。若文件已存在,原有内容将被更新
"wb+"(读写)     为读/写建立一个新的二进制文件。功能与"w+"相同;可由位置函数设置读写起始位置
"a+"(读写)      为读/写打开一个文本文件。功能与"a"相同,只是在文件尾部添加新数据后,可以从头开始  读
"ab+"(读写)     为读/写打开一个二进制文件。功能与"a+"相同,只是在文件尾部添加新数据之后,可由位置  函数设置开始读的起始位置
-------------------------------------------------------------------------------------------------
.读、写数据:
  读写数据将通过调用标准输入输出函数来完成。这些函数主要包括:
  1fgetc()getc():从制定文件中一次读取一个字符
       fputc()putc():一次输出一个字符到指定文件  
  2fgets():从指定文件中一次读取一个字符串
       fputs():一次输出一个字符串到指定文件
  3fread():从指定文件中一次读取一个数据块
       fwrite():一次输出一个数据块到指定文件
  4fscanf():从指定文件中按格式读取数据
       fprintf():按指定格式将数据输出到指定文件中
  文件定位函数,使“读写位置指针”直接指向指定的读写位置:
  fseek():可移动位置指针到指定位置上
  ftell():可获得当前位置指针的位置
  rewind():“反绕”函数,可使位置指针回到文件的开头
.关闭文件
    读、写操作完成之后,必须先将先将文件关闭
       fclose(文件指针)
   函数调用成功后返回0,否则返回非0
---------------------------------------------------------------------------------------------------------------------------------------------
怎样向文本文件写入单个字符:
#include <stdio.h>
main()
{
   FILE  *fpc;    //定义文件指针
   char  ch;
   if( (fpc = fopen("A1.TXT","w")) == NULL )  //文件打开不成功就退出程序的执行
      {
         printf("can't open this file!!\n");
         exit(0);
       }
   ch = getchar();
   while( ch != '@')
       {
         fputc(ch, fpc);
         ch = getchar();
        }
  fclose(fpc);
}
上例表达式fopen("A1.TXT","w")是:  为“只写”而打开一个名为"A1.TXT"的文本文件,程序执行后,如果当前目录下没有名字为A1.TXT的文件,系统将在该目录下新建;如果已经存在,则从文件的其始位置重新写,文件中所有原有内容全部更新。
----------------------------------------------------------------------------------------------------------------------------------------------
5.向文本文件写入字符串
#include <stdio.h>
main()
{
  FILE    *fps;
  char    str[8];
  if( (fps=fopen("A2.TXT","a")) == NULL)
    {
      printf("can't open this file!\n");
      exit(0);  
    }
  while( strlen( gets(str)>0 )
    {
      fputs(str,fps);
      fputs("\n",fps);
    }
  fclose(fps);
  printf("\n");
}
----------------------------------------------------------------------------------------------------------------------------------------------
4.从文本文件中读取单个字符
#include <stdio.h>
main()
{
  FILE    *fpc;
  char    ch;
  if( (fpc=fopen("A1.TXT","r")) == NULL)
    {
      printf("can't open this file!\n");
      exit(0);
    }
  ch = fgetc(fpc);
  while( ch!=EOF)
    {
      putchar(ch);
      ch = fgetc(fpc);
    }
  fclose(fpc);
  putchar("\n");
}
----------------------------------------------------------------------------------------------------------------------------------------------
文件函数
函数名    函数原型说明      功能                  返回值
---------------------------------------------------------------------------------------------
fopen   FILE  *fopen(char         mode指定的方式打开名  成功返回文件指针(文件
          *filename,                filename的文件   信息区的其始地址),否则
          char *mode);       返回NULL
例:
---------------------------------------------------------------------------------------------
fclose    int fcolse(FILE  *fp);    关闭fp所指的文件,释放文件缓冲区    出错返回非0,否则返回0
例:
----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
格式化写文件
#include <stdio.h>
void num(FILE *);
main()
{
  FILE *fp;
  char *fname;
  fname = "NUM.TXT";
  if( (fp = fopen(fname,"w")) == NULL )
    {
      printf("Can't open this file ! \n");
      exit(0);
    }
  num(fp);
  fclose(fp);
}
void num(FILE *fp)
{
  char name[20];
  int num;
  scanf("%s%d",name,&num);
  while(nu>o)
  {
    fprintf( fp, "%s  %d\n", name, num);
    scanf("%s%d",name,&num);
  }
}
----------------------------------------------------------------------------------------------------------------------------------------------
格式化读文件
#include <stdio.h>
void num(FILE *);
main()
{
  FILE    *fp;
  char    *fname;
  fname = "NUM.TXT"
  if( (fp = fopen(fname,"r")) == NULL )
  {
    prinf("can't open this file ! \n");
    exit(0);
  }
  num(fp);
  fclose(fp);
}
void num(FILE *f)
{
  char name[20];
  int nu;
  fscanf(f,"%s%d",name,&nu);
  while(!feof(f))
  {
    printf("%s %d\n", name, nu);
    fscanf(f,"%s%d",name,&d);
  }
}
----------------------------------------------------------------------------------------------------------------------------------------------
文件的数据块读写方式
按数据块方式对一个二进制文件进行读写操作的例子:
/*文件的数据块读写
by searcher
2002-9-12 */
#include <string.h>
#include <stdio.h>
struct student
{
char name[20];
int  num;
char sex;
struct
{
  int year;
  int month;
  int day;
}birthday;
float cj[3];
};
main()
{
struct student pes[3] = {{"wanghai",1015,'M',1985,2,22,80,95,60.5},{"haixin",1017,'F',
  1984,1,2,57,60,78},{"lili",1019,'F',1984,3,2,77.0,90,77.5}};
int i;
FILE *fpr;
struct student b;
fpr = fopen("W.DAT","wb+");
for(i=0;i<3;i++)
  fwrite(pes+i,sizeof(struct student),1,fpr);
fseek(fpr,0L,SEEK_SET);
for(i=0;i<3;i++)
{
  fread(&b,sizeof(struct student),1,fpr);
  printf("%7s    ",b.name);
  printf("%c     ",b.sex);
  printf("%d    %d    %2d",b.birthday.year,b.birthday.month,b.birthday.day);
  printf("%5.1f %5.1f %5.1f",b.cj[0],b.cj[1],b.cj[2]);
  printf("\n");
}
getchar();
fclose(fpr);
}
//fwrite()fread()一般用于二进制文件
//fread(&b,sizeof(struct student),1,fpr)中,第一个参数表示b的地址,第二个参数表示一次所读取
//的数据块的字节数,第三个参数是数字1,表示每次读取一个数据块,最后一个为文件指针
-----------------------------------------------------------------------------------------------------------------------------------------------
文件复制方法
/*文件复制
by searcher
2002-9-12*/
#include <stdio.h>
#include <stdlib.h>
void filecp(FILE *,FILE *);
void main(int argc, char *argv[])
{
FILE *fpin, *fpout;
printf("argc= %d\n",argc);
if(argc < 3)
{
  printf("cmdline outto get at less than 3 cmd!\n");
  exit(0);
}
if(argc > 3)
{
  printf("cmdline outto get 3 cmd! \n");
  exit(0);
}
if(argc == 3)
{
  if( (fpin = fopen(argv[1],"r")) == NULL )
  {
   printf("can't open file! \n");
   exit(0);
  }
  if( (fpout = fopen(argv[2],"w")) == NULL)
  {
   printf("can't open file! \n");
   exit(0);
  }
  filecp(fpin,fpout);
  fclose(fpin);
  fclose(fpout);
}
else
  printf("error!\n");
}
void filecp(FILE *fpin, FILE *fpout)
{
char ch;
ch = getc(fpin);
while(!feof(fpin))
{
  putc(ch,fpout);
  ch = getc(fpin);
}
}
上面的程序总有问题,程序运行时命令行参数argc的个数为什么总是1呢??????
所以,运行结果也总是:"error!"
-----------------------------------------------------------------------------------------------------------------------------------------------
文件定位函数
1.fseek()函数:
    用来移动文件位置指针到指定的位置上,从此位置接着读、写操作。函数的调用形式如下:
   
         fseek(pf, offset, origin)
         pf是文件指针,offset是以字节为单位的位移量,为长整型数;origin是起始点,
       用以指定位移量是以哪个位置为基准的,起始点既可用标识符来表示,也可用数字
       来代表。
     标识符       数字    代表的起始点
    SEEK_SET       0       文件开始
    SEEK_END    2       文件末尾
    SEEK_CUR       1       文件当前位置
例如:
    fp已指向一个二进制文件,能使位置指针从文件的开头向文件尾部移动20个字节的fseek()函数的
    调用形式如下:
        
           fseek(fp, 20L, SEEK_SET)
例如:
    fp已指向一个二进制文件,能使位置指针从文件尾部向文件开头移动10sizeof(int)的函数的调
    用形式如下:
           fseek(fp, -10L*sizeof(int), SEEK_END)
对于文本文件,位移量必须为0
例如:fp已指向一个文本文件,能使位置指针移到文件起始位置的fseek()函数形式如下:
         fseek(fp, 0L, SEEK_SET)
例如:fp以指向一个文本文件,能使位置指针移到文件末尾的fseek()函数的调用形式如下:
         fseek(fp, 0L, SEEK_END)
2.ftell()函数:
    调用ftell()函数可以得到当前位置指针相对于文件起始位置的字节数。函数调用出错时,返回-1L.
    例如:当打开一个文件时,通常并不知道该文件的长度,通过以下程序段可以求出该文件的字节数:
          fseek(fp, 0L, SEEK_END);   //把位置指针移到文件末尾
          t = ftell(fp);             //求出文件的总字节数
    再例如:某二进制文件中存放的struct st结构体类型数据,可以通过以下程序,可求出该结构体类型
    数据块的个数:
           fseek(fp, 0L, SEEK_END);
           t = ftell(fp);
           n = t/sizeof(struct st);
3.rewind()函数:
     又称“反绕”函数,能使位置指针回到文件的开头。函数调用形式如下:
            rewind(fp);
      fp为文件指针,此函数没有返回值。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-23 05:56 , Processed in 0.061331 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表