C fopen,fseek,fprintf,feof,ftell,rewind

1.      fopen

Ø  函数原型:

FILE * fopen ( const char * filename, constchar * mode )

Ø  功能:

  : 打开一个流 

Ø  返回值

If the file is successfully opened, thefunction returns a pointer to a FILE objectthat can be used to identify the stream on future operations.
Otherwise, a null pointer is returned.

Ø  函数说明

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode
有下列几种形态字符串:
r
打开只读文件,该文件必须存在。
r+
打开可读写的文件,该文件必须存在。
w
打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+
打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a
以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+
以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上述的形态字符串都可以再加一个b字符,如rbw+bab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno中。
附加说明
一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

范例
#include
main()
{
FILE * fp;
fp=fopen
(“noexist”,”a+”);
if(fp= =NULL) return;
fclose(fp);
}

 

 

2.      fseek()函数

Ø  函数原型:

int fseek ( FILE * stream, long int offset, int origin );

Ø  : 重定位流上的文件指针

Ø  : int fseek(FILE *stream, long offset, int fromwhere);

Ø  : 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

Ø   返回值: 成功,返回0,否则返回其他值。
  fseek position the file position pointer for the file referenced bystream to the byte location calculated by offset.

Ø  程序例:
 
 #include
  long filesize(FILE *stream);
  int main(void)
  {
  FILE *stream;
  stream = fopen("MYFILE.TXT", "w+");
  fprintf(stream, "This is a test");
  printf("Filesize of MYFILE.TXT is %ld bytes\n",filesize(stream));
  fclose(stream);
  return 0;
  }
  long filesize(FILE *stream)
  {
  long curpos, length;
  curpos = ftell(stream);
  fseek(stream, 0L, SEEK_END);
  length = ftell(stream);
  fseek(stream, curpos, SEEK_SET);
  return length;
  }

 

         int fseek( FILE *stream, long offset,int origin );
       
第一个参数stream为文件指针
       
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
       
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR SEEK_END      SEEK_SET
        SEEK_SET
文件开头
        SEEK_CUR
当前位置
        SEEK_END
文件结尾
   
其中SEEK_SET,SEEK_CURSEEK_END和依次为012.
  
简言之:
  fseek(fp,100L,0);
fp指针移动到离文件开头100字节处;
  fseek(fp,100L,1);
fp指针移动到离文件当前位置100字节处;
  fseek(fp,100L,2);
fp指针退回到离文件结尾100字节处。

 

 

3.      fprintf()函数

Ø  头文件:#include

Ø  定义函数:int fprintf(FILE * stream, const char * format, ...);

Ø  函数说明:fprintf()会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束('\0')为止。

Ø  返回值:关于参数format 字符串的格式请参考printf().成功则返回实际输出的字符数, 失败则返回-1,错误原因存于errno .

范例

1
#include
main()
{
    int i = 150;
    int j = -100;
    double k = 3.14159;
    fprintf(stdout, "%d %f %x \n", j, k, i);
    fprintf(stdout, "%2d %*d\n", i, 2, i);
}

2

#include

 

int main ()

{

   FILE * pFile;

   int n;

   char name [100];

 

   pFile = fopen("myfile.txt","w");

   for (n=0 ; n<3; n++)

   {

     puts("please, enter a name: ");

     gets (name);

     fprintf (pFile,"Name %d [%-10.10s]\n",n+1,name);

   }

   fclose (pFile);

 

   return 0;

}

 

4.      feof()函数

Ø  函数原型

int feof ( FILE * stream );

Ø  示例程序(函数的意思程序写的非常明确与EOF的区别)

 

/* feof example: byte counter */

#include

 

int main ()

{

  FILE * pFile;

  int n = 0;

  pFile = fopen("myfile.txt","rb");

  if (pFile==NULL)perror ("Error opening file");

  else

  {

    while (fgetc(pFile)!= EOF) {

      ++n;

    }

    if (feof(pFile)){

      puts("End-of-File reached.");

      printf("Total number of bytes read: %d\n", n);

    }

    else puts("End-of-File was not reached.");

    fclose (pFile);

  }

  return 0;

}

Ø  说明

 EOF的值为-1,是int类型数据,在32位系统中,可以表示为0xFFFFFFFF; EOF 不是一个字符,也不是文件中实际存在的内容。EOF不但能表示读文件到了结尾这一状态,它还能表示 I/O 操作中的读、写错误(可以用ferror() 来检测)以及其它一些关联操作的错误状态;
      feof()
只用于测试流文件的结束,当到达结尾时,返回非0;当文件内部位置指针指向文件结束时,并未立即置位FILE结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用feof才会返回为真。
     
函数如fgetcgetc返回EOF并不一定表示文件结束,当读取文件出错时也会返回EOF,仅凭返回-1就认为文件结束是错误的;正因为如此,我们需要feof()来判断文件是否结束,当然用feof()来判断文件结束时也需要判断读取操作是否出错,这时可以用ferror()来判断,当其为真时表示有错误发生。在实际的程序中,应该每执行一次文件操作,就用用ferror函数检测是否出错。

 

5.  ftell() 函数

Ø  函数原型:

long int ftell ( FILE * stream );

Ø  功能

 返回当前文件位置,也就是说返回FILE指针当前位置

Ø  示例

举例1

#include<stdio.h>

intmain(void)

{

FILE*stream;

stream= fopen("MYFILE.TXT", "w+");

fprintf(stream,"This is a test");

printf("Thefile pointer is at byte \

%ld\n",ftell(stream));

fclose(stream);

return0;

}

2

#include

main()

{

FILE*myf;

longf1;

myf=fopen("1.txt","rb");

fseek(myf,0,SEEK_END);

f1=ftell(myf);

fclose(myf);

printf(“%d\n”,f1);

}

 

6.  rewind()  函数

Ø  函数原型:

void rewind ( FILE * stream );

Ø  功能:

将文件内部的位置指针重新指向一个流(数据流/文件)的开头

Ø  注意

不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。

rewind函数作用等同于 (void)fseek(stream, 0L, SEEK_SET);[1]

Ø  示例程序:

#include

#include

intmain(void)

{

FILE*fp;

charfname[10] = "TXXXXXX", *newname, first;

newname= mktemp(fname);

fp= fopen(newname,"w+");

if(NULL==fp)

return1;

fprintf(fp,"abcdefghijklmnopqrstuvwxyz");

rewind(fp);

fscanf(fp,"%c",&first);

printf("Thefirst character is: %c\n",first);

fclose(fp);

remove(newname);

return0;

}

 

 

 

你可能感兴趣的:(C++)