文件操作(标准I/O)

编译环境:Dev c++编译器
编程语言:c语言

文件打开模式:

1 - r(read):读
2 - w(write):写
3 - a(append):追加
4 - t(text):文本文件
5 - b(banary):二进制文件
6 - +:读和写

文件的格式分为:文本文件和二进制文件
文件的读取方式:顺序读取和随机读取

第一组:fputc和fgetc函数(字符形式读取)

  • fgetc函数

从指定磁盘文件中中读取一个字符:int fgetc(FILE *fp)
从指定文件中读取一个字符,成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF(EOF是一个宏,通常为-1)
文件位置:在文件内部有一个位置指针,用来指向当前读写到的位置,文件刚打开时指向第一个字节,使用fgetc可以连续读取多个字符,位置指针仅仅是一个标志,表示位置由系统自动设置,对用户是隐藏的

#include<stdio.h>
int main()
{
	char c;
    FILE *fp;
    if( (fp=fopen("data.txt", "r")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    while((c=fgetc(fp))!=EOF){
		printf("%c",c);
	}
	printf("读取完毕!\n");
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述

  • fputc函数

向指定磁盘文件中写入一个字符:int foutc(int ch,FILE *fp)
ch为写入的字符,fp为文件指针,成功返回写入的字符,失败返回EOF

#include<stdio.h>
int main()
{
	char c;
    FILE *fp;
    if( (fp=fopen("data.txt", "aw")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    while((c=getchar())!='\n'){
		fputc(c,fp);
	}
	printf("写入完毕!\n");
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述

第二组:fputs和fgets函数(字符串形式读取)

  • fgets函数

从指定磁盘文件中读取一个字符串:char *fgets(char *str,int n,FILE *fp)
str为字符数组,n为要读取的字符数目,fp为文件指针
返回值:成功返回字符数组首地址,失败返回NULL
读取到的字符串会在末尾自动添加’\0’,n个字符包括’\0’,实际读取了n-1个字符

#include<stdio.h>
#define num 100
int main()
{
	char str[num];
    FILE *fp;
    if( (fp=fopen("data.txt", "r")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    while((fgets(str,num,fp))!=NULL){
		printf("%s\n",str);
	}
	printf("读取完毕!\n");
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述

  • fputs函数

向指定磁盘文件写入一个字符串:int fputs(char *str,FILE *fp)
str为要写入的字符串,fp为文件指针
返回值:成功返回非负数,失败返回EOF

#include<stdio.h>
int main()
{
	char str[20]="我爱中国123abc";
    FILE *fp;
    if( (fp=fopen("data.txt", "aw")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    fputs(str,fp);
	printf("写入完毕!\n");
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述
第三组:fread和fwrite函数(数据块形式读取)

  • fread函数

从指定磁盘文件中读取块数据:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp )

  • fwrite函数

向指定磁盘文件中写入块数据:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp )

ptr:块数据指针
size:每个数据块的字节数
count:读写的数据块的数量
fp:文件指针
返回值:成功返回读写的块数量count,失败返回值小于count

#include<stdio.h>
struct stu{
    char name[10];
    int num; 
    int age;  
    float score;  
}usa[2], usb[2];
int main(){
    FILE *fp;
    int i;
    if( (fp=fopen("data.txt", "wb+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    printf("Input data:\n");
    for(i=0; i<2; i++){
        scanf("%s %d %d %f",usa[i].name, &usa[i].num,&usa[i].age, &usa[i].score);
    }
    fwrite(usa, sizeof(struct stu), 2, fp);
    rewind(fp);
    fread(usb, sizeof(struct stu), 2, fp);
    for(i=0; i<2; i++){
        printf("%s  %d  %d  %f\n", usb[i].name, usb[i].num, usb[i].age, usb[i].score);
    }
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述
第四组:fscanf和fprintf函数(格式化形式读取)

从指定的磁盘文件中读取格式字符: int fscanf(FILE *fp,char *format, … )
向指定的磁盘文件中写入格式字符: int fprintf(FILE *fp,char *format, … )
fp:文件指针
format:格式控制字符串
… :表示参数列表
返回值:成功返回写入/读取的字符个数,失败返回负数

#include<stdio.h>
#define num 5
struct stu{
    char name[10];
    int number;
    int age;
    float score;
} usa[num], usb[num];
int main(){
    FILE *fp;
    int i;
    if( (fp=fopen("data.txt","a+")) == NULL ){
        puts("Fail to open file!");
        exit(0);
    }
    printf("Input data:\n");
    for(i=0; i<num; i++){
        scanf("%s %d %d %f", usa[i].name, &usa[i].number, &usa[i].age, &usa[i].score);   
    }
    for(i=0; i<num; i++){
        fprintf(fp,"姓名: %s 学好: %d 年龄: %d 成绩: %f\n", usa[i].name, usa[i].number, usa[i].age, usa[i].score);   
    }
    rewind(fp);
    for(i=0; i<num; i++){
        fscanf(fp, "姓名: %s 学好: %d 年龄: %d 成绩: %f\n", usb[i].name, &usb[i].number, &usb[i].age, &usb[i].score);
    }
    for(i=0; i<num; i++){
        printf("%s  %d  %d  %f\n", usb[i].name, usb[i].number, usb[i].age, usb[i].score);
    }
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述

第五组:rewind和fseek函数(随机读写方式)

将位置指针移动到文件开头:void rewind(FILE *fp)
将位置指针移动到任意位置:int fseek(FILE *fp,long offset,int origin)
fp:文件指针
offset:偏移量
origin:相对于offset的起始位置
文件开头:SEEK_SET:0
当前位置:SEEK_CUR:1
文件末尾:SEEK_END:2
(fssek()一般用于二进制文件,文本文件中位置可能不准确)

#include<stdio.h>
#define num 3
struct stu{
    char name[10]; 
    int number;  
    int age; 
    float score;  
}usr[num], user;
int main(){
    FILE *fp;
    int i;
    if( (fp=fopen("data.txt", "ab+")) == NULL ){
        printf("Cannot open file, press any key to exit!\n");
        exit(1);
    }
    printf("Input data:\n");
    for(i=0; i<num; i++){
        scanf("%s %d %d %f", usr[i].name, &usr[i].number, &usr[i].age, &usr[i].score);
    }
    fwrite(usr, sizeof(struct stu), num, fp);  
    fseek(fp, sizeof(struct stu), SEEK_SET);  
    fread(&user, sizeof(struct stu), 1, fp); 
    printf("%s  %d  %d %f\n", user.name, user.number, user.age, user.score);
    fclose(fp);
    return 0;
}

运行截图:
在这里插入图片描述

总结

总体来说文件的操作:
1、打开文件设备(fopen)
2、确定程序使用的数据(字符、字符串、块数据、格式化数据)
3、使用函数时要配对使用(选择一对函数)
4、读取/写入操作
5、关闭文件设备(fclose)

二进制按照二进制格式写入磁盘文件,一般的编辑器打开乱码
在大量读写文件操作时,一定要对文件指针位置明确,还有写入和读取的格式一定要对应
在一般的程序中,文件充当的是数据库,对信息数据库的写入和读取操作,因为程序跑在内存中,在程序运行结束后,所有数据丢失,写入磁盘/硬盘文件方便程序以后使用

c语言管理系统中:
一般使用fscanf()和fprintf()函数来进行文件读写
直接可以整块的读取或写入结构体信息,写入的信息也可以进行查看

猜你喜欢

转载自blog.csdn.net/qq_42856154/article/details/93225821