读写TXT文件笔记2

上一篇笔记写到了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<stdio.h>

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<stdio.h>

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<stdio.h>

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

猜你喜欢

转载自blog.csdn.net/qq_61139806/article/details/124056466
今日推荐