C语言--文件操作

目录

一、文件的打开与关闭

 二、文件顺序读写

 fgetc、fputc分别是从文件中读取一个字符、输入一个字符到文件中。

fscanf和fprintf 

fread与fwrite

三、文件的随机读写

fseek

 ftell

 rewind

 四、文件读取结束的判定feof


一、文件的打开与关闭

首先需要创建一个文件指针:

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判断返回值是否小于实际要读的个数

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值