FILE文件操作
文件打开与关闭
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 版权协议,转载请附上原文出处链接和本声明。