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字符,如rb、w+b或ab+等组合,加入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_CUR和SEEK_END和依次为0,1和2.
简言之:
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才会返回为真。
函数如fgetc或getc返回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;
}