C语言文件操作入门讲解(附应用实例)

“ Ctrl AC!一起 AC!”

目录

流的概述

输入流

输出流

标准流

文件的分类

文本文件

二进制文件

文件指针

文件的打开与关闭

fopen()函数

文件读写模式

fclose()函数

文件检测函数

feof()函数

ferror()函数

文件的读写操作

字符读写函数

fgetc()函数

fputc()函数

字符串读写函数

fgets()函数

fputs()函数

格式化读写函数

fscanf()函数

fprintf ()函数

数据块读写函数

fread ()函数

fwrite()函数

文件的随机读写

文件的定位

fseek()函数

ftell()函数

rewind()函数

各读写函数应用实例

fgetc & fputc

fgets & fputs

 fscanf & fprintf

fread & fwrite


流的概述

在C语言中的每个串行输入源和输出目标被称为“流”。

输入流

输入流是一个串行数据源,可以为程序提供数据。

输出流

输出流是串行数据的目的地,可以接受程序的输出。

在输入操作中,字节从输入设备流向内存,在输出操作中,字节从内存流向输出设备。

标准流

程序开始执行时,标准流会自动连接程序,可以直接使用。

C语言三种标准流
流名称流含义默认连接设备
stdin标准输入键盘
stdout标准输出屏幕
stderr标准错误屏幕

文件的分类

文本文件

文本文件就是用字节来存储信息,如C程序源代码文件(后缀为“.c”)。

二进制文件

二进制文件用二进制数来存储信息,如C程序的可执行文件(后缀为“.exe”)。

文件指针

文件指针的类型为:

FILE * 

如:

FILE *fp1 *fp2;

就定义了两个文件指针

文件的打开与关闭

fopen()函数

功能:以某方式打开某文件。

返回:打开文件成功返回文件指针,否则返回空指针。

样例:

FIEL *fp; //定义一个文件指针
fp=fopen("onefile.txt","r"); //以“r”的方式打开“onefile.txt”文件

其中“r” 是一种文件读写模式。

文件读写模式

fclose()函数

功能:关闭已打开的文件。

返回:如果成功关闭则返回零,否则返回EOF。

样例:

fclose(fp) //关闭了fp所指向的已开文件

文件检测函数

feof()函数

功能:检测文件指针读写位置是否已到达文件末尾。

返回:若已到末尾,则返回非0值(逻辑真);否则返回0(逻辑假)

样例:

feof(fp); //检测fp指针是否达到文件末尾

常用于控制文件的读写:

while(!feof(fp))
    文件读写语句;

ferror()函数

功能:检测输入输出函数的调用是否出错。

返回:正常时函数返回0值,出错时函数返回非0值。

样例:

文件读写语句;
if(ferror(fp))
    printf("文件读写错误!\n");

文件的读写操作

字符读写函数

fgetc()函数

功能:从文件读取一个字符。

返回:若读取成功则返回该字符,若读到文件尾则返回EOF。

样例:

while(!feof(fp))
{   
    char=ch;
    ch=fgetc(fp); //ch得到文件指针所指的字符
    ...
}
while((ch=fgetc(fp))!=EOF) //判断文件是否已读到文件末尾

fputc()函数

功能:将一个字符写入文件。

返回:若写入成功则返回ch;否则返回EOF。

样例:

fputc('A',fp); //将‘A’写入fp所指的文件中

字符串读写函数

fgets()函数

功能:从指定文件中读入一行字符串。

返回:函数返回字符数组的首地址;若读取失败,返回NULL。

样例:

函数原型:
char *fgets(char *s,int n,FILE *fp);
样例:
fgets(s,20,fp);

函数原型中的n的长度包括字符串末尾的'\0',所以样例表示:从fp指向的文件中读取最大长度为19的字符串存入s。

常用:

fgets(s,sizeof(s),stdin)
//代替gets()函数,防止输入数据过长而导致非法访问

fputs()函数

功能:将一个字符串写入指定的文件。

返回:写入成功返回一个非负数,否则返回EOF。

样例:

函数原型:
int fputs(const char *s,FILE *fp);
样例:
fputs(s,fp);

格式化读写函数

fscanf()函数

功能:按格式从文件读出信息。

返回:执行成功则返回输入项的个数,否则返回0。

样例:

函数原型:
int fscanf(FILE *fp,const char *format, 变量地址列表);
样例:
fscanf(fp,"%s%d",name,&age);
//表示从fp指定的文件中读取一个字符串和一个整型数据存入name和age

fprintf ()函数

功能:按格式向文件写入信息。

返回:若成功则返回读入的字节数。

样例:

函数原型:
int fprintf(FILE *fp,const char *format,输出项列表);
样例:
char name[12]="Tony";
int age=20;
...
fprintf(fp,"%12s%6d",name,age);
//将字符串name和整型变量age的值存入fp所指向的文件

数据块读写函数

fread ()函数

原型:

unsigned fread(void *buffer,unsigned size, unsigned count,FILE *fp);

该函数从fp所指的文件中读取数据块并存储到buffer指向的内存中,buffer是待读入数据块存放的起始地址,size是每个数据块的大小,即待读入的每个数据块的字节数,count是最多允许读取的数据块个数。

返回:函数返回实际读到的数据块个数。

fwrite()函数

原型:

unsigned fwrite(const void *buffer,unsigned size,unsigned count,FILE *fp);

同上,该函数的功能是将buffer指向的内存中的数据块写入fp所指的文件,该数据块共有count个数据项,每个数据型有size个字节。

返回:执行成功则返回实际写入的数据块的个数;若所写实际数据块少于需要写入的数据项,则出错。

注意:用fwrite()写入文件的数据应该用fread()函数按相应的格式来进行读取,才能正确还原数据。

文件的随机读写

文件的定位

fseek()函数

功能:移动文件读写位置指针到指定位置。

调用方式:

fseek(文件指针,位移量,移动起始点);
起始点的取值
符号名含义
SEEK_SET0文件开头
SEEK_CUR1文件当前位置
SEEK_END2文件末尾

位移量 指从起始点为基点移动的字节数,正数为向文件尾移动(称为前移),负数为向文件头移动(称为后移)。

返回:如果执行成功,返回0;否则返回非0值。

样例:

fseek(fp,sizeof(a)*2,SEEK_SET);
//表示将文件读写位置指针从文件开头向前移动两个单位的a变量。

注意:fseek()函数一般用于二进制的文件读写!

ftell()函数

功能:告诉文件出错位置。

返回:出错时返回-1。

样例:

//调用格式
ftell(fp);
//样例
long postion;
if((postion=ftell(fp))==-1L) //L 是指该-1是long long型
   printf("A file error has occurred at %ld.\n",postion);

rewind()函数

功能:使文件读写位置指针重新回到文件开头处。

返回:调用成功则返回0,否则返回非0值。

调用格式:

rewind(fp);

各读写函数应用实例

fgetc & fputc

· 编写一个程序,从键盘向一个txt文件输入若干行字符串(以"#"作为结束标志),并将文件的内容读出到屏幕上。

· 上代码:

#include<stdio.h>
int main() {
	char ch;
	FILE* fp;
	fp = fopen("new_file.txt", "w");
	if (fp != NULL) {
		printf("请输入若干行文本,以“#”结束\n");
		while ((ch = getchar()) != '#') {//读到‘#’结束
			fputc(ch, fp);//将ch放入fp所指的文件
		}
		fclose(fp);
	}
	else
		printf("文件创建失败!\n");
	fp = fopen("new_file.txt", "r");
	if (fp != NULL) {
		printf("文件内容是:\n");
		while (!feof(fp)) {
			ch = fgetc(fp);//将读到的字符放入ch,以便输出
			putchar(ch);
		}
		fclose(fp);
	}
	else
		printf("文件打开失败!\n");
	return 0;
}

· 运行情况:

fgets & fputs

见博主的另一篇文章,嘻嘻

c++ fgets与fputs的应用实例https://blog.csdn.net/m0_62434776/article/details/122107751?spm=1001.2014.3001.5501

 fscanf & fprintf

· 将学生一的信息复制给学生二

· 上代码:

#include<stdio.h>
int main() {
	FILE* fp;
	fp = fopen("new_file.txt", "w+");
	char name1[12] = "Tony";
	int score1 = 20;
	char name2[20]; int score2=0;
	fprintf(fp, "%12s%6d", name1, score1);
	rewind(fp);//写完后指针需要重回起点
	fscanf(fp, "%s%d", name2, &score2);
	fclose(fp);
	printf("学生2的姓名和成绩:\n");
	puts(name1);
	printf("%d", score2);
	return 0;
}

· 运行情况:

fread & fwrite

· 题目同上

· 上代码:

#include <stdio.h>
typedef struct people {
    char name[10];
    int age;
}peop;
int main()
{
    peop p1[2] = { {"Astudent", 24}, {"BStudent", 20} };
    peop p2[2];
    FILE* fp = fopen("new_file", "w+");
    fwrite(p1, sizeof(peop), 2, fp);
    rewind(fp);
    fread(p2, sizeof(peop), 2, fp);
    fclose(fp);
    for (int i = 0; i < 2; i++) {
        puts(p2[i].name);
        printf("%d\n", p2[i].age);
    }
    return 0;
}

· 运行情况:

 感谢阅读!!!

“ Ctrl AC!一起 AC!”

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ctrl AC

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

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

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

打赏作者

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

抵扣说明:

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

余额充值