C语言详解 FILE文件操作

  • Post author:
  • Post category:其他




文件打开与关闭



fopen函数打开数据文件

fopen函数的调用方式为:

fopen(文件名,使用方式)

;

例如:fopen("student.txt", "r"); // 以只读的方式打开student.txt文件


打开文件的常用方式

"r"(只读):只能从文件中读数据,该文件必须先存在,否则打开失败
"w"(只写):只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
"a"(追加):向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾


"rb"(只读):只能从文件中读数据,该文件二进制文件必须先存在,否则打开失败
"wb"(只写):向文件写数据,若指定的二进制文件不存在则创建它,如果存在则先删除它再重建一个新文件
"ab"(追加):向二进制文件尾部添加数据,若文件不存在则打开失败,打开时位置指针移到文件末尾


"r+":可读/写数据,该文件必须先存在,否则打开失败
"w+":可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
"a+":可读/写数据,原来的文件不被删去,位置指针移到文件末尾

打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母'b’,以表


常用一下方式打开一个文件

if((fp = fopen("fishc.txt", "r")) == NULL){
		printf("can not open fishc1.txt");
		system("pause");
}



fclose函数打开数据文件

关闭文件用fclose函数, fopen与fclose是成对出现的,有fopen就要有fclose。


fclose函数调用的一般形式为:fclose(文件指针);


例如:fclose(fp);



顺序读写数据文件



fgetc/fputc向文件读写字符


函数名

调用形式

功能

返回值

fgetc

fgetc(fp)

从fp指向的文件读入一个字符

读取成功,返回所读的字符,失败则返回文件结束标志EOF(-1)

fputc

fputc(ch, fp)

把字符ch写到文件指针变量fp所指的文件中

写入成功,返回所写的字符, 写入失败返回EOF(-1)


fputc应用


在这里插入图片描述
在这里插入图片描述

fgetc应用


在这里插入图片描述
在这里插入图片描述



fgets/fputs向文件读写一个字符串


函数名

调用形式

功能

返回值

fgets

fgets(str, n, fp)

从fp指向的文件读入一个长度为(n-1)的字符串,存放在字符数组str中

读取成功,返回地址str,失败则返回NULL

fputs

fputs(str, fp)

把str所指向的字符串写到文件指针变量fp所指向的文件中

写入成功,返回0, 写入失败返回非0


fputs应用

在这里插入图片描述
在这里插入图片描述

fgets应用


在这里插入图片描述



fread/fwrite用二进制方式向文件读写一组数据


调用形式:

fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
其中:
	buffer: 是一个地址,对于fread来说,它是用来存放从文件读入的数据的存储区的地址。对fwrite来说,要把此地址开始的存储区中的数据向文件输出。
	size:要读些的字节数
	count:要读些多少个数据项(每个数据项长度为size)
	fp: FILE类型的指针


fwrite示例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 4

struct Student{
	char name[10];
	int num;
	int age;
	char addr[15];
}stu[SIZE];  // 在这里声明相当于全局变量

void write(){
	int i;
	FILE *fp;  // 文件指针
	if((fp = fopen("students", "wb")) == NULL){  // 为了写入数据,打开一个二进制文件
		printf("read error!\n");
		exit(0);
	}
	
	for(i = 0; i < SIZE; i++){
		fwrite(&stu[i], sizeof(struct Student), 1, fp);  // 从文件中读取一个数据块,读写的时候是以二进制形式进行的
	}
	
	fclose(fp);
}

void main(){
	int i;
	
	for(i = 0; i < SIZE; i++){
		// 注意%s对应项不用再取地址符号&了,应为本身就是地址,向int,float都要有&取地址符号
		scanf("%s %d %d %s", stu[i].name, &stu[i].age, &stu[i].num, stu[i].addr);
	}
	
	write();
}

在这里插入图片描述


fread示例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 4

struct Student{
	char name[10];
	int num;
	int age;
	char addr[15];
}stu[SIZE];  // 在这里声明相当于全局变量

void read(){
	int i;
	FILE *fp;  // 文件指针
	if((fp = fopen("students", "rb")) == NULL){  // 为了读取数据,打开一个二进制文件
		printf("read error!\n");
		exit(0);
	}
	
	for(i = 0; i < SIZE; i++){
		fread(&stu[i], sizeof(struct Student), 1, fp);  // 从文件中读取一个数据块,读写的时候是以二进制形式进行的
	}
	
	fclose(fp);
}

void main(){
	int i;
	read();
	
	for(i = 0; i < SIZE; i++){
		printf("%s    %d    %d    %s\n", stu[i].name, stu[i].age, stu[i].num, stu[i].addr);
	}
}

在这里插入图片描述



随机读写数据文件



rewind函数使文件位置标记指向文件开头

rewind函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值。

例题:有一个文件,内有一些信息,要去第一次将它的内容显示在屏幕上,第二次把它复制到另一个文件上.

#include<stdio.h>
#include<stdlib.h>
void main(){
	FILE *fp1, *fp2;
	fp1 = fopen("student.txt", "r");     // 打开需要读的文件
	fp2 = fopen("student_copy.txt", "w");  // 打开需要写入的文件
	
	while(!feof(fp1)){     // 逐个读入字符并输出到屏幕
		char ch = fgetc(fp1);
		putchar(ch);
	}
	
	rewind(fp1);  // 
	
	while(!feof(fp1)){
		char ch = fgetc(fp1);
		fputc(ch, fp2);
	}
	
	fclose(fp1);
	fclose(fp2);
}



fseek函数改变文件位置标记

fseek函数的调用形式:

fseek(文件类型指针,位移量,起始点)


起始点

名字

用数字代表

文件开始位置

SEEK_SET

0

文件当前位置

SEEK_CUR

1

文件末尾位置

SEEK_END

2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define SIZE 4

struct Student{
	char name[10];
	int num;
	int age;
	char addr[15];
};  // 在这里声明相当于全局变量

void main(){
	struct Student student;
	FILE *fp;  // 文件指针
	if((fp = fopen("students", "rb")) == NULL){  // 这个是一定要进行判断的,打开一个只读二进制文件
		printf("read error!\n");
		exit(0);
	}
	
	// i * sizeof(struct Student)表示去第i+1个数据,和数组相似,i像数组的下标
	fseek(fp, 3*sizeof(struct Student), 0);  
	fread(&student, sizeof(struct Student), 1, fp);
	
	
	printf("%s   %d   %d   %s", student.name, student.age, student.num, student.addr);
}



版权声明:本文为qq_43751200原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。