其实每个被使用的文件都在内存中开辟了?个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)这些信息是保存在?个结构体变量中的。该结构体类型是由系统声明的,取名FILE
例如:VS2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
当然这是在这个编译器下面的,不同的编译器的FILE不尽相同,但整体大同小异。
FILE* pf;
这个也叫文件指针变量
定义pf是?个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是?个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。
//打开?件
FILE * fopen ( const char * filename, const char * mode );
//关闭?件
int fclose ( FILE * stream )
代码示例:
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开?件
pFile = fopen ("myfile.txt","w");
//?件操作
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
//关闭?件
fclose (pFile);
}
return 0;
}
上面说的适用于所有输入流?般指适用于标准输入流和其他输入流?
#include<stdio.h>
int main()
{
FILE* pFile1;
FILE* pFile2;
char c;
pFile1 = fopen("data.txt", "r");
if (pFile1 == NULL)
{
perror("fopen->data.txt");
return 1;
}
pFile2 = fopen("data_copy.txt", "w");
if(pFile2==NULL)
{
fclose(pFile1);
pFile1 = NULL;
perror("fopen->data_copy.txt");
return 1;
}
while ((c = fgetc(pFile1)) != EOF)
{
fputc(c, pFile2);
}
fclose(pFile2);
fclose(pFile1);
return 0;
}
我们先创建一个文本文件:data.txt
然后运行代码:
我们得到了这个拷贝的文件 data_copy.txt
int fseek ( FILE * stream, long int offset, int origin );
代码示例:
#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;
}
运行结果:
我们创建了一个文本文件,记录着这个:
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream );
代码示例:
#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;
}
运行结果:
如果你直接运行,结果一定是这个
因为没有相应文件
所以你要创建一个相应的文件
然后运行,结果是:
void rewind ( FILE * stream );
代码示例:
#include <stdio.h>
int main ()
{
int n;
FILE * pFile;
char buffer [27];
pFile = fopen ("myfile.txt","w+");
for ( n='A' ; n<='Z' ; n++)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]='\0';
printf(buffer);
return 0;
}
这个是先写入,再打印
运行结果
牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
注意:因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。
这篇较为重要推荐自己多多尝试