C语言文件操作

以下是对C语言文件相关操作的粗略学习,具体的相关源码开源在Github

文件的打开

FILE *fp;
fp = fopen("文件名""文件打开方式");

功能:fopen()打开一个指向文件名的文件,文件操作方式由打开方式的值决定
返回值:正常打开为返回一个指向该文件信息结构体的指针,若错误,则返回错误表示NULL
文件打开方式参数
说明

  1. “文件名”指出对哪个具体文件进行操作,一般需要指定文件路径,否则默认为与程序的当前路径相同
  2. 以“r”方式打开的文件应该已经存在,以“w”方式打开的文件,如果不存在,则新建一个,否则在打开时将该文件删去,然后重新建立一个新文件
  3. 若不希望删除原有数据,则应该用“a”方式打开
  4. 用“*+”方式打开的文件可以用来输入输出数据
  5. 不允许同一文件在关闭前被再次打开
    在这里插入图片描述

文件的关闭

fclose(文件指针);

功能:关闭文件指针对应的文件,并返回一个整数值
返回值:若成功关闭,则返回0,否则返回一个非零值

文件的读写

字符方式的文件读写

int fgetc(FILE *fp);

功能:从fp指向的文件中读取一个字节代码
返回值:正常则返回督导的代码值,读到文件尾或出错则返回EOF

int fputc(int c, FILE *fp);

功能:把一字节代码c写入fp指向的文件中
返回值:正常则返回c,出错返回EOF

字符串方式的文件读写

#include <stdio.h>
#include <process.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
	char string[20];
	FILE *fp;
	if((fp = fopen("f1.txt","w+")) == NULL) {
		printf("File open error!\n");
		exit(0);
	}
	printf("input a string: \n");
	// gets()函数读入回车符时停止,且回车符不作为字符串读入,因此只输入回车时,字符串长度为0,循环结束
	while(strlen(gets(string))>0) {
		fputs(string,fp);
		/*
		 * 把回车符写入到文件中,这样在fgets()函数读出文件数据时遇到回车符及结束,才能利用循环结构用
		 * fgets()函数多次读出字符串并输出,输出的字符串才能换行。若无该语句,文件中没有换行符,在使用
		 * fgets()函数时,将一次性读出文件所有字符直到文件结尾,这样输出时,字符串在同一行中。
		 */  
		fputs("\n",fp);
		}
		// 把指针fp所致的文件的内部位置指针移动到文件头
		rewind(fp);
		while(fgets(string,20,fp) != NULL) {
		puts(string);
	}
	if(fclose(fp)) {
		printf("Can not close the file!\n");
		exit(0);
	}
	return 0;
}

注:fgets()函数读到回车符时,也将其作为一个字符读入到字符串中,gets()函数则不会;fputs()函数不会在写入文件的字符串末尾加上回车符,而puts()函数会输出回车符。

格式化文件的读写

int fprintf(FILE *fp, 格式控制串, 输出列表);
int fscanf(FILE *fp, 格式控制串, 输入列表);

功能:fprintf()函数按格式控制串中的控制符把响应数据写入fp指向的文件中;fscanf()函数从fp指向的文件中按格式控制串中的控制符,读取相应的数据,并赋给输入列表中对应的变量地址中。
返回值:成功返回读写个数,出错或位于文件尾,返回EOF

数据块读写函数

按数据块读写文件,能方便地对程序中的数组、结构体数据进行整体输入输出

int fread(void *ptr, int size, int count, FILE *fp);
int fwrite(void *ptr, int size, int count, FILE *fp);

功能:fread()函数在fp指定的文件中读取count次数据项(每次size字节),存放到以ptr所指的内存单元地址中。fwrite()函数为从ptr为首地址的内存中取出count次数据项(每次size字节),写入fp所指的磁盘文件中。
返回值:成功返回读写的块数;出错或处于文件尾,返回0

注意:用fread()和fwrite()读写时,必须向二进制文件读写数据项

文件定位函数

fseek()函数

int fseek(FILE *fp, long offset, int from);

功能:控制文件的位置指针移动。from表示起始位置,文件首部:0/SEEK_SET,当前位置:1/SEEK_CUR,文件尾部:2/SEEK_END。offest表示以起始点为基点,向前移动的字节数。
返回值:定位成功为0,不成功则为非0的整数值
举例

// 将位置指针移动到离文件头100字节处
fseek(fp, 100L, 0);

// 将位置指针移动到离当前位置50字节处
fseek(fp, 50L, 1);

// 将位置指针从文件末尾处向后退10字节
fseek(fp, 50L, 2);

// 将位置指针移动到离文件尾部前20字节处
fseek(fp, -20L, SEEK_END);

ftell()函数

long ftell(FILE *fp);

功能:获取当前文件指针的位置,即相对于文件开头的位移量(字节数)
返回值:成功时,返回值>=0,即文件指针的当前指向,出错时返回-1L

rewind()函数

void rewind(FILE *fp);

功能:定位文件指针,使文件指针指向读写文件的首地址,即打开文件时文件指针所指向的位置

feof()函数

int feof(FILE *fp);

功能:判断fp指针是否已经到文件末尾
返回值:返回值为1时,表示到文件结束位置;返回值为0时,表示文件未结束

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿彬y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值