学习笔记---文件读写

41 篇文章 0 订阅
26 篇文章 0 订阅

C语言文件读写


printf(),scanf(),getchar(),putchar()等语句,都是将数据输出到标准输出stdout(显示器),或从标准输入stdin(键盘)读取数据。并要依赖include <stdio.h>

但当需求操作的数据量十分巨大时,标准的输入和输出就显得力不从心了。

而通过从磁盘文件中读写数据,能够弥补这个缺陷。


数据传输:



解析:

1.程序运行时,产生的所有数据都暂存在内存的程序数据区中。

2.当输入/输出数据时,数据从磁盘/程序数据区转移入输入/输出缓存区,然后再从输入/输出缓存区转移至程序数据区/磁盘。

3.操作系统将外部设备也当做文件进行管理。即:标准输入/输出的流程也如上图所示,不过是磁盘换成了键盘/显示器。


使用C语句操作文件时的步骤:

1.定义文件指针变量

2.打开文件

3.对文件进行读写

4.关闭文件


打开文件

含义:

将文件信息从磁盘装入计算机内存,建立与文件有关的信息,建立文件指针与文件名之间的关联


形式:

fp=fopen(文件名,使用文件方式);


返回值:

成功:  FILE类型指针

失败:  NULL


举例:

FILE *fp;
fp=fopen("c:\\A1.txt","r");

注1:这里指定的文件是在c盘根目录下的A1.txt文件。

注2:实际上文件的实际路径是c:\A1.txt  多了一个斜杠是因为\在C语句中是作为转义字符出现的。为了使其只作为\字符使用,需要加上一个转义字符使其转义。

注3:在程序开始运行时,系统会自动打开:标准输入(stdin)、标准输出(stdout)、标准错误(stderr)这三个文件。所以我们使用scanf或printf函数时不需要指定文件指针


使用文件方式:

文件使用方式
方式含义
"r"只读,为输入打开一个文本文件
"w"只写,为输出打开一个文本文件
"a"追加,向文本文件尾增加数据


写入(输出到文件)


格式化输出:

fprintf(文件指针,格式字符串,输出表列);




代码示例1:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试数据写入文件操作
*/
int main()
{
    FILE *outp;
    outp=fopen("testio.txt","w");
    if(outp==NULL)
    {
        printf("文件打开失败!\n");
        exit(0);
    }
    int temp;
    int i=10;
    while(i--)
    {
        scanf("%d",&temp);
        fprintf(outp,"%d\t",temp);
    }
    printf("done");
    fclose(outp);
    return 0;
}

结果:

1.控制台:


2.项目文件夹内:


3.输出的txt文件内:



解析:

1.注意FILE定义的是一个指针而非变量

2.exit(0)可以直接中止程序,但要使用这个函数必须在文件头部加上include <stdlib.h>

3.定义了outp指针并执行outp=fopen()之后,文件指针outp就代表需要打开的文件。之后所有对该文件的操作都利用outp来完成。

4.fopen()函数用于打开文件,成功将返回一个FILE类型的指针,失败将返回NULL。所以可以通过判断该指针的值是否为NULL来判断打开时候成功

5.fprintf()函数用于将数据输出至目标文件。

6.fclose()函数用于关闭文件,在关闭的同时,会将缓存区中剩余所有的数据读入/写出。所以为了保证文件读写不出现数据流失的情况,fclose是必须被使用的。



代码示例2:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试输出数据至csv文件
*/
int main()
{
    FILE *fp;
    int i,No;
    float salary;
    fp=fopen("data.csv","w");//csv格式是一种可以直接作为Exce表格打开的格式,十分有用。
    if(fp==NULL)
    {
        printf("File cannot open!");
        exit(0);
    }
    //输入5名员工的工号和工资,并保存入文件中

    for(i=0;i<5;i++)
    {
        scanf("%d %f",&No,&salary);
        fprintf(fp,"%d,%.2f\n",No,salary);//csv格式默认使用逗号分隔数据,所以这里输出时用逗号分隔。
    }
    fclose(fp);

    return 0;
}

结果:


1.控制台:


2.项目文件夹内:


3.用表格打开:


4.用记事本打开:


解析:

1.如上所示,能够通过改变输出文件的后缀名,改变输出文件的格式。

2.和printf()函数相同,fprintf()也能通过改变格式字符串改变输出数据的格式(如示例2,在No和salary间使用逗号分隔就是通过改变格式字符串实现的)。



读取(从文件输入)

格式化输入:

fscanf(文件指针,格式字符串,输入表列);


代码示例:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试格式化输入(从文件读取数据)
*/
int main()
{
    FILE *fp;
    if((fp=fopen("data.csv","r"))==NULL)//将对文件指针的赋值和空值判断放在一起,提高代码效率。
    {
        printf("file cannot open");
        exit(0);
    }
    int i=5,No=0;
    double salary;
    while(i>0)
    {
        fscanf(fp,"%d,%lf",&No,&salary);//此处的格式字符串要符合输入数据的格式
        printf("%d\t%.2f\n",No,salary);
        i--;
    }
    printf("done");
    return 0;
}

结果:



解析:

fscanf基本和scanf的使用相同,可以类比fprintf和printf的区别来理解。


字符型数据的读写


字符型写入:


函数原型:int fputc(int ch,FILE *fp);


功能:把字符ch写到fp指向的磁盘文件中。


返回值:

成功:返回被写入的字符(即ch所代表的字符)

失败:返回EOF(值为-1)


代码示例:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试字符数据的文件写入
*/
int main()
{
    FILE *fp;
    char c;
    if((fp=fopen("data.dat","w"))==NULL)
    {
        printf("File cannot open!");
        exit(0);
    }
    while((c=getchar())!=EOF)//EOF即Ctrl+z 值为-1
    {
        fputc(c,fp);//将字符写入文件
    }
    fclose(fp);
    return 0;
}
结果:

控制台:


项目文件夹内:



dat文件内:


解析:

EOF即Ctrl+z只要从键盘输入这个值,上述代码中的循环就将结束


字符型数据读取


函数原型:int fgetc(FILE *fp);


函数功能:

从文件指针fp指向的文件当前位置(位置指针)读出一个字符,然后文件位置指针自动后移,指向文件中的下一个字符,返回值为读入的字符。

若遇到文件结束符,则返回结束符EOF(-1).


返回值:

成功:读入的字符

失败或读到文件末尾:结束符EOF(-1)


代码示例:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试从文件中读取字符型数据
*/
int main()
{
    FILE *fp;
    if((fp=fopen("data.dat","r"))==NULL)
    {
        printf("File cannot open!");
        exit(0);
    }
    char c;
    while((c=fgetc(fp))!=EOF)
    {
        putchar(c);
    }
    fclose(fp);
    return 0;
}
结果:


解析:

当读完了所有数据,最后会读到一个EOF(文件结束符)。所以这里将这个作为循环结束的标志。


应用


文件的操作
读/写指定格式以字符为单位
从文件读入fscanf(文件指针,格式字符串,输入表列);fgetc(文件指针);
写到文件中fprintf(文件指针,格式字符串,输出表列);fputc(文件指针);


示例1:

复制文件

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来将source.txt复制为target.txt
*/
int main()
{
    FILE *fpin,*fpout;
    char c;
    printf("file copy.....\t");
    if((fpin=fopen("source.txt","r"))==NULL)
    {
        printf("Source fille cannot open!");
        exit(0);
    }
    if((fpout=fopen("target.txt","w"))==NULL)
    {
        printf("Target file cannot open!");
        exit(0);
    }
    while((c=fgetc(fpin))!=EOF)
    {
        fputc(c,fpout);
    }
    fclose(fpin);
    fclose(fpout);
    printf("done");
    return 0;
}

结果:



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值