上一篇笔记写到了fopen函数和fclose函数,这篇笔记我们写fgetc_fputc函数、fgets_fputs函数、fread_fwrite函数。
一、一次读写一个字符
函数声明:
int fgetc(FILE *stream);
函数说明:
fgetc从stream所标识的文件中读取一个字节,将字节值返回。
返回值:
以t的方式:读到文件结尾返回EOF(EOF是在stdio.h文件中定义的符号常量,值为-1)
以b的方式:读到文件结尾,使用feof(文件指针)判断结尾
feof是C语言标准库函数,其原型再stdio.h中,其功能是检测流上的文件结束符,若文件结束则返回非0值,否则返回0。
函数的声明:
int fputc(int c,FILE *stream)
函数的说明:
fputc将c的值写到stream所代表的文件中。
返回值:
如果输出成功,则返回输出的字节值
如果输出失败,则返回一个EOF
※※注意:打开文件时,默认读写位置在文件的开始,如果以a的方式打开读写位置在文件的末尾,向文件中读取字节或写入字节时读写位置会往文件的末尾偏移,读多少个字节,读写位置就往文件的末尾偏移多少个字节。
例:
#include
int main()
{
FILE *fp1,*fp2;
char ch;
fp1=fopen("test.txt","r");
if(fp1==NULL)
{
perror("fopen");
return 0;
}
fp2=fopen("test2.txt","w");
if(fp2==NULL)
{
perror("fopen");
return 0;
}
while((ch=fgetc(fp1))!=EOF)
{
fputc(ch,stdout);
fputc(ch,fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
test.txt文件中的内容:
test2.txt文件中原来是一个空文件,执行上述程序后,test2.txt文件内容:
注意:若没有test2.txt文件,会先创建一个内容为空test2.txt文件。
二、一次读写一个字符串
char *fgets(char *s,int size,FILE *stream);
从stream所标识的文件中读取字符,在读取时碰到换行符或者是碰到文件的末尾停止读取,或者是读取了size-1个字节停止读取,在读取的内容后面会加一个'\0',作为字符串的结尾。
返回值:
成功返回数组的首地址,即s。
失败返回NULL。
int fputs(const char *s,FILE *stream);
函数功能:
将s指向的字符串,写到stream所代表的文件中。
返回值:
成功返回写入的字节数.
失败返回 -1。
例:
#include
int main()
{
FILE* fp_read,*fp_write;
char str[100];
fp_read=fopen("test.txt","r");
if(fp_read==NULL)
{
perror("fopen");
return 0;
}
fp_write=fopen("dest.txt","w");
if(fp_write==NULL)
{
perror("fopen");
return 0;
}
fgets(str,6,fp_read);
printf("str=%s\n",str);
fputs(str,fp_write);
return 0;
}
test.txt文件中的内容:
执行上述程序后dest.txt文件中的内容:
若将fgets(str,6,fp_read)中的6改为16,dest.txt文件中的内容:
之所以只读了十个字符是因为helloworld后面有一个换行符。
三、读文件fread
函数的声明:
size_t_fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
函数的说明:
fread函数从stream所标识的文件中读取数据,每块是size个字节,共nmemb块,存放到ptrh指向的内存里。
返回值:实际读到的块数。
例:
unsigned int num;
num=fread(str,100,3,fp);
从fp所代表的文件中读取内容存放到str指向的内存中,读取的字节数为,每块100个字节,3块。返回值 num:
如果读到300个字节,返回值为3
如果所读字节数大于等于200小于300,返回值为2
如果所读字节数大于等于100小于200,返回值为1
不到100个字节则返回0。
四、写文件fwrite
函数的声明:
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream);
函数的说明:
fwrite函数将ptr指向的内存里的数据,向stream所标识的文件中写入数据,一块是size个字节,共nmemb块。
返回值:实际 写入的块数。
例:
#include
struct stu
{
char name[10];
int num;
int age;
}stu1[2],stu2[2];
int main()
{
FILE *fp;
int i;
fp=fopen("student.txt","wb+");//把文件当作二进制文件打开
if(fp==NULL)
{
perror("fopen");
return 0;
}
for(i=0;i<2;i++)
{
scanf("%s %d %d",stu1[i].name,&(stu1[i].num),&(stu1[i].age));
}
fwrite(stu1,sizeof(struct stu),2,fp); //将学生信息写入文件中
rewind(fp); //文件指针经过写操作已经到了最后,需要复位
fread(stu2,sizeof(struct stu),2,fp); //将文件中的数据读入内存中
printf("%s %d %d\n",stu2[0].name,stu2[0].num,stu2[0].age);
printf("%s %d %d\n",stu2[1].name,stu2[1].num,stu2[1].age);
return 0;
}
※※注意:
fwrite函数是将内存中的数据原样输出到文件中。
fread函数是将文件中的数据原样读取到内存里。(按字节读取)
五、随机读写
完成文件定位的函数:rewind、fseek函数
1.rewind 复位读写位置
rewind 函数: void rewind(文件指针);
函数功能:把文件内部位置指针移到文件首
调用形式:rewind(文件指针);
例:
fwrite(pa,sizeof(struct stu),2,fp);
rewind(fp);
fread(pb,sizeof(struct stu),fp);
2.ftell测文件读写位置距文件开始有多少个字节
定义函数:long ftell(文件指针);
函数功能:取得文件流目前的读写位置
返回值:返回当前读写位置(距文件起始的字节数),出错时返回-1.
例:
long int length;
length =ftell(fp);
3.fseek定位位置指针(读写位置)
fseek函数(一般用于二进制文件即打开文件的方式需要带b)
函数声明:
int fseek(FILE *stream,long offset,int whence);
int fseek(文件类型指针,位移量,起始点);
offset是正数则往文件末尾偏移,是负数则往文件开头位置偏移。
函数功能:移动文件流的读写位置。
whence起始位置
文件开头 | SEEK_SET | 0 |
文件当前位置 | SEEK_CUR | 1 |
文件末尾 | SEEK_END | 2 |