目录
fgetc、fputc分别是从文件中读取一个字符、输入一个字符到文件中。
一、文件的打开与关闭
首先需要创建一个文件指针:
FILE* pf;//文件指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。
创建好文件指针后就可以进行文件操作:
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
使用fopen函数来打开文件,fclose来关闭文件。
//打开文件
FILE * fopen ( const char * filename, const char * mode );//参数为文件名,打开方式。
//关闭文件
fclose ( FILE * stream );//参数为文件指针名
打开文件的方式有如下类别:
注意:以w方式写文件时 会将原来文件中存在的内容请清空再进行写。
例:
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开文件
pFile = fopen ("myfile.txt","w");//myfile.txt为文件名和后缀,w为打开方式
//文件操作
if (pFile=NULL)
{
return1;
}
//对文件进行操作
//。。。。
fclose (pFile);//关闭文件
return 0;
}
二、文件顺序读写
使用的函数如下:
fgetc、fputc分别是从文件中读取一个字符、输入一个字符到文件中。
int fgetc( FILE *stream );//他返回的是字符对应的ascall码
int fputc( int c, FILE *stream );读取字符c到文件中。
char *fgets( char *string, int n, FILE *stream );//从文件读取n个字符(包括‘\0’)给string
int fputs( const char *string, FILE *stream );将string的字符串写入文件中
例:
写:
int main()
{
FILE* fp;
fp=fopen("test.txt", "w");//以写文件的方式打开
char arr='H';
fputc(arr,fp);//写入一个字符arr到文件中
fclose(fp);
return 0;
}
读:
int main()
{
FILE* fp;
fp = fopen("test.txt", "r");
char arr;
arr=fgetc(fp);//读取一个字符给arr
printf("%c", arr);
fclose(fp);
return 0;
}
fscanf和fprintf
int fscanf( FILE *stream, const char *format [, argument ]... );
int fprintf( FILE *stream, const char *format [, argument ]...);
这两个函数用法与scanf、printf相似,区别在于要加上文件指针名。fprintf是将内容打印在文件中,fscanf是从文件中读取信息。
例:
int main()
{
FILE* fp;
fp = fopen("test.txt", "w");
char str[10]="abcdef";
fprintf(fp, "%s", str);//打印arr在文件中
fclose(fp);
fp = fopen("test.txt", "r");
char arr[10];
fscanf(fp,"%s", arr);
printf("%s", arr);
fclose(fp);
return 0;
}
fread与fwrite
以二进制进行读和写
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
- buffer -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
- size -- 这是要读取的每个元素的大小,以字节为单位。
- count -- 这是元素的个数,每个元素的大小为 size 字节。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
- buffer -- 这是指向要被写入的元素数组的指针。
- size -- 这是要被写入的每个元素的大小,以字节为单位。
- count -- 这是元素的个数,每个元素的大小为 size 字节。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
int main()
{
FILE* fp;
fp = fopen("test.txt", "wb");
char str[100]="13655dsdw";
fwrite(str, sizeof(str), 1, fp);//写
fclose(fp);
fp = fopen("test.txt", "rb");
char arr[100];
fseek(fp, 0, SEEK_SET);//从文件起始位置读取
fread(arr,sizeof(str), 1, fp);//读
printf("%s", arr);
fclose(fp);
return 0;
}
三、文件的随机读写
fseek
int fseek ( FILE * stream, long int offset, int origin );
offset--偏移量
origin有以下几类:
SEEK_CUR Current position of file pointer文件指针当前位置
SEEK_END End of file 文件末尾
SEEK_SET Beginning of file 文件起始位置
例:
int main()
{
FILE* pFile;
pFile = fopen("test.txt", "wb");
fputs("This is an apple.", pFile);//写入文件
fseek(pFile, 9, SEEK_SET);//从起始位置读取到第9位置
fputs(" sam", pFile);写入文件
fclose(pFile);
return 0;
}
ftell
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream );
例:
int main()
{
FILE* pFile;
long size;
pFile = fopen("test.txt", "rb");
if (pFile == NULL)
perror("Error opening file");
else
{
fseek(pFile, 0, SEEK_END); //文件末尾位置
size = ftell(pFile);//返回文件末尾到文件起始位置偏移量
fclose(pFile);
printf("Size of test.txt: %ld bytes.\n", size);
}
return 0;
}
文件信息:
偏移量为17:
rewind
让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );
int main()
{
int n;
FILE* pFile;
char buffer[27];
pFile = fopen("test.txt", "w+");
for (n = 'A'; n <= 'Z'; n++)
fputc(n, pFile);
rewind(pFile);//返回到起始位置
fread(buffer, sizeof(buffer), 1, pFile);
fclose(pFile);
buffer[26] = '\0';
puts(buffer);
return 0;
}
四、文件读取结束的判定feof
在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
1. 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数