头文件:<stdio.h>、<cstdio>
1、通过“streams”来操作物理设备:如键盘、打印机、终端等。
2、流通过指针来连接“FILE”对象,三个自动创建的标准流:stdin, stdout 和 stderr。
指示信息:
1、错误指示:当流操作发生错误是置位,可以通过ferror函数检查,通过 clearerr, freopen 或者 rewind重置。
2、文件结束:读/写到文件结束时置位,可通过feof检查,通过 clearerr/freopen 或者重定位函数(rewind, fseek and fsetpos)置位。
3、位置指示:在读/写操作中,指向流的下一个字符的内部指针。可以通过 ftell and fgetpos获得其值,通过 rewind, fseek and fsetpos 改变其值。
一、文件操作
1、int remove ( const char * filename );
param:filename,文件名(可以包含文件路径)
return:若成功,返回0;否则返回非零值
/* remove example: remove myfile.txt */
#include <stdio.h>
int main ()
{
if( remove( "myfile.txt" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return 0;
}
2、int rename ( const char * oldname, const char * newname );
param:oldname,原文件名(可以包含文件路径); newname,新文件名(可以包含文件路径)
return:成功重命名,返回0;否则返回非零。
/* rename example */
#include <stdio.h>
int main ()
{
int result;
char oldname[] ="oldname.txt";
char newname[] ="newname.txt";
result= rename( oldname , newname );
if ( result == 0 )
puts ( "File successfully renamed" );
else
perror( "Error renaming file" );
return 0;
}
3、FILE * tmpfile ( void );
创建一个临时的二进制文件。自动创建,当流关闭时删除。
ret:指向临时文件的流指针;失败返回NULL。
/* tmpfile example */
#include <stdio.h>
#include <string.h>
int main ()
{
char buffer [256];
FILE * pFile;
pFile = tmpfile ();
do {
if (!fgets(buffer,256,stdin)) break; //临时缓冲文件流
fputs (buffer,pFile);
} while (strlen(buffer)>1);
rewind(pFile);
while (!feof(pFile)) {
if (fgets (buffer,256,pFile) == NULL) break;
fputs (buffer,stdout);
}
fclose (pFile);
return 0;
}
4、char * tmpnam ( char * str );
返回一个文件名(与原来所有文件不同)。
如果str是空指针,返回的字符串存储在静态数组中,可用返回值取得。
如果str不是空指针,将指向至少 L_tmpnam字符的数组,次数组用提到的临时文件名填充
para:指向字符数组的指针,此字符以C-字符串存储临时文件名。 ret:成功,返回指向字符串的指针;如果str为NULL,返回指向内部缓存的指针。失败,返回NULL。
/* tmpnam example */
#include <stdio.h>
int main ()
{
char buffer [L_tmpnam];
char * pointer;
tmpnam (buffer);
printf ("Tempname #1: %s\n",buffer);
pointer = tmpnam (NULL);
printf ("Tempname #2: %s\n",pointer);
return 0;
}
二、文件访问
1、int fclose ( FILE * stream );
描述:关闭文件。成功,返回0;失败,返回EOF。
2、int fflush ( FILE * stream );
描述:文件等待更新(读/写),文件将在输出操作后、输入操作前更新。成功,返回0;失败,返回EOF。
/* fflush example */
#include <stdio.h>
char mybuffer[80];
int main()
{
FILE * pFile;
pFile = fopen ("example.txt","r+");
if (pFile == NULL) perror ("Error opening file");
else {
fputs ("test",pFile);
fflush (pFile); // flushing or repositioning required
fgets (mybuffer,80,pFile);
puts (mybuffer);
fclose (pFile);
return 0;
}
}
3、FILE * fopen ( const char * filename, const char * mode );
描述:
文件名(C-风格字符串),mode(r,w,a,r+,w+,a+)。
成功,返回指向文件的指针;失败,返回NULL。
4、FILE * freopen ( const char * filename, const char * mode, FILE * stream );
描述:
重新以新的文件名或模式打开流文件。
文件名改变,先关闭原文件,断开流定向;然后重定向流到新的文件。如果文件名为空,改变文件的模式。
如果文件成功重新打开,返回新文件流指针;否则,返回NULL。
/* freopen example: redirecting stdout */
#include <stdio.h>
int main ()
{
freopen ("myfile.txt","w",stdout);
printf ("This sentence is redirected to a file.");
fclose (stdout);
return 0;
}
5、void setbuf ( FILE * stream, char * buffer );
描述:
流:打开的对象
buffer:使用者申请的buff,至少BUFSIZ bytes。
当文件流指向打开的文件,但无任何读/写操作时使用。
/* setbuf example */
#include <stdio.h>
int main ()
{
char buffer[BUFSIZ];
FILE *pFile1, *pFile2;
pFile1=fopen ("myfile1.txt","w");
pFile2=fopen ("myfile2.txt","a");
setbuf ( pFile1 , buffer );
fputs ("This is sent to a buffered stream",pFile1);
fflush (pFile1);
setbuf ( pFile2 , NULL );
fputs ("This is sent to an unbuffered stream",pFile2);
fclose (pFile1);
fclose (pFile2);
return 0;
}
6、int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
描述:
改变流缓存,改变模式和大小。
如果buffer指针为空,自动申请buffer。
/* setvbuf example */
#include <stdio.h>
int main ()
{
FILE *pFile;
pFile=fopen ("myfile.txt","w");
setvbuf ( pFile , NULL , _IOFBF , 1024 );
// File operations here
fclose (pFile);
return 0;
}
三、格式化输入输出
四、字符输入输出
五、直接输入输出
1、size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
描述:
从流中读取数据块。
读取count元素,每个元素大小为size bytes,从stream保存到内存块ptr。
返回值:成功读取的元素数目。
/* fread example: read an entire file */
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen ( "myfile.bin" , "rb" );
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
/* the whole file is now loaded in the memory buffer. */
// terminate
fclose (pFile);
free (buffer);
return 0;
}
2、size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
描述:写块数据到流。
写count元素,每个元素大小为size bytes,从内存块ptrstream到stream。
返回值:成功写的元素数目。
/* fwrite example : write buffer */
#include <stdio.h>
int main ()
{
FILE * pFile;
char buffer[] = { 'x' , 'y' , 'z' };
pFile = fopen ("myfile.bin", "wb");
fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
fclose (pFile);
return 0;
}
六、文件定位
1、int fgetpos ( FILE * stream, fpos_t * pos );
描述:
在流中取回当前的位置。
成功,返回0;失败,返回非0.
/* fgetpos example */
#include <stdio.h>
int main ()
{
FILE * pFile;
int c;
int n;
fpos_t pos;
pFile = fopen ("myfile.txt","r");
if (pFile==NULL) perror ("Error opening file");
else
{
c = fgetc (pFile);
printf ("1st character is %c\n",c);
fgetpos (pFile,&pos);
for (n=0;n<3;n++)
{
fsetpos (pFile,&pos);
c = fgetc (pFile);
printf ("2nd character is %c\n",c);
}
fclose (pFile);
}
return 0;
}
2、int fseek ( FILE * stream, long int offset, int origin );
重定位流的位置。
offset:从origin开始的字节数。
origin:位置。(SEEK_SET SEEK_CUR SEEK_END)
成功,返回0;失败,返回非0.
如果读/写错误,设置ferror。
/* fseek example */
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ( "example.txt" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}
3、int fsetpos ( FILE * stream, const fpos_t * pos );
重新存储流的当前位置到pos。成功,返回0;失败,返回非0。
/* fsetpos example */
#include <stdio.h>
int main ()
{
FILE * pFile;
fpos_t position;
pFile = fopen ("myfile.txt","w");
fgetpos (pFile, &position);
fputs ("That is a sample",pFile);
fsetpos (pFile, &position);
fputs ("This",pFile);
fclose (pFile);
return 0;
}
4、long int ftell ( FILE * stream );
成功,返回当前的位置。失败,返回-1L。
得到流中当前的位置。
/* ftell example : getting size of a file */
#include <stdio.h>
int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}
5、void rewind ( FILE * stream );
设置流的位置到begging。
七、异常处理
1、void clearerr ( FILE * stream );
重置error和eof标志。
2、int feof ( FILE * stream );
检查eof标志。
eof置位,返回非零。否则,返回0。
3、int ferror ( FILE * stream );
检查error标志。
4、void perror ( const char * str );
打印错误信息。
八、宏常量
BUFSIZ:缓存大小
EOF:文件结尾
FILENAME_MAX:文件名的最大长度
FOPEN_MAX:同时打开流的极限值
L_tmpnam:临时文件名的最小长度
NULL:空指针
TMP_MAX:临时文件最大数量
九、类型
FILE:控制流的对象
fpos_t:文件中的特定位置对象
size_t:无符号整型
十、对象
stderr:标准错误流,FILE * stderr;
stdin:标准输入流,FILE * stdin;
stdout:标准输出流,FILE * stdout;