“21好习惯“第一期-17

本文介绍了C语言中文件操作的基本函数,如fopen用于打开文件(包括'r', 'r+', 'a'模式),fgetc和fputc用于字符读写,fgets和fputs处理字符串,以及fclose关闭文件。通过实例展示了如何使用这些函数实现文件内容显示、链接和数据格式化存储。
摘要由CSDN通过智能技术生成

 21:30:17
文件打开与关闭操作
fopen():文件打开操作
头文件:stdio.h
函数定义:FILE *fopen(char *pname, char *mode)
函数说明:pname是文件名,mode是打开文件的方式
mode:"r" 打开一个已经存在的文件文本,文件不存在则出错




以“r+”的方式打开一个文件,会清空文件的原始内容,重新写入数据

返回值:正常返回:FILE *一个指向文件在内存中的文件信息去的开头

异常返回:NULL,表示打开操作不成功

打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;

 返回值
   正常返回:被打开文件的文件指针。
   异常返回:NULL,表示打开操作不成功。

 要说明的是:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。
 fclose():文件关闭
函数定义:int fclose(FILE *fp);

函数说明:fp是一个以打开的文件的文件指针

返回值:

正常返回:0

异常返回:EOF,表示文件在关闭时发生错误


 

fgetc:读取一个字符
函数定义:int fgetc(FILE *fp)

函数说明:从fp中读取一个字符,作为返回值返回

返回值:

正常返回:返回读取字符的代码

异常返回:返回EOF。例如:要从“写打开”的文件中读取一个字符时,会发生错误而返回一个EOF

 21:30:17
//程序名为:display.c
//执行时可用:display filename1 形式的命令行运行。显示文件filename1中的内容。例如,执行命令行display display.c将在屏幕上显示display的原代码。
 
//File display program.
#include <stdio.h>
void main(int argc,char *argv[]) //命令行参数
{
    int ch;//定义文件类型指针
    FILE *fp;//判断命令行是否正确
    if(argc!=2)
    {
        printf("Error format,Usage: display filename1\n");
        return; //键入了错误的命令行,结束程序的执行
    }
    //按读方式打开由argv[1]指出的文件
    if((fp=fopen(argv[1],"r"))==NULL)
    {
        printf("The file <%s> can not be opened.\n",argv[1]);//打开操作不成功
        return;//结束程序的执行
    }
    //成功打开了argv[1]所指文件
    ch=fgetc(fp); //从fp所指文件的当前指针位置读取一个字符
    while(ch!=EOF) //判断刚读取的字符是否是文件结束符
    {
        putchar(ch); //若不是结束符,将它输出到屏幕上显示
        ch=fgetc(fp); //继续从fp所指文件中读取下一个字符
    } //完成将fp所指文件的内容输出到屏幕上显示
    fclose(fp); //关闭fp所指文件
}

 21:30:17
fputc:写一个字符到文件中
函数定义:int fputc(int ch, FILE*fp)

函数说明:ch是一个整型变量,要写到文件的字符

fp:文件指针,要写入的文件

返回值:

正常返回:要写入的字符的代码

异常返回:返回EOF

 21:30:17
fgets():从文件中读取一个字符串
函数定义:char *fgets(char *str, int n, FILE *fp)

函数说明:由fp指出的文件中读取n-1个字符,并把他们存放到有str指出的字符数组中区,最后加上一个由字符串结束符'\0'

参数说明:str:接受字符串的内存地址,可以是数组别名,也可以是指针

n:指出要读取的字符的个数

fp:这个是文件指针,指出要从中读取字符的文件

返回值:

正常返回:字符串的内存首地址,即str的值

异常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。

fputs():写入字符串到文件中去
函数定义:把由str之处的字符串写入到fp所指的文件中去

函数说明:

str:之处要写入到文件中去的字符串,不包括最后的'\0'

fp:这个是文件指针,之处字符串要写入到的文件指针

返回值:

正常返回:写入到的文件的字符个数,即字符串的长度

非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。

5.实例

 21:30:17
//程序名:linkfile.c
//执行时可用:linkfile filename1 filename2形式的命令行运行,将文件filename2的内容附加在文件filename1之后。
// file linked program.
#include <stdio.h>
#define SIZE 512
void main(int argc,char *argv[])
{
    char buffer[SIZE];
    FILE *fp1,*fp2;
    if(argc!=3)
    {
        printf("Usage: linkfile filename1 filename2\n");
        return;
    }
    // 按追加方式打开argv[1] 所指文件
    if((fp1=fopen(argv[1],"a"))==NULL)
    {
        printf("The file %s can not be opened.\n",argv[1]);
        return;
    }
    if((fp2=fopen(argv[2],"r"))==NULL)
    {
        printf("The file %s can not be opened.\n",argv[2]);
        return;
    }
    // 读入一行立即写出,直到文件结束
    while(fgets(buffer,SIZE,fp1)!=NULL)
        printf("%s\n",buffer);
    while(fgets(buffer,SIZE,fp2)!=NULL)
        fputs(buffer,fp1);
    fclose(fp1);
    fclose(fp2);
    if((fp1=fopen(argv[1],"r"))==NULL)
    {
        printf("The file %s can not be opened.\n",argv[1]);
        return;
    }
    while(fgets(buffer,SIZE,fp1)!=NULL)
        printf("%s\n",buffer);
    fclose(fp1);
}

 21:30:17
. 往文件中写格式化数据

1.函数原型

int fprintf(FILE *fp,char *format,arg_list)
2.功能说明
  将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
3.参数说明
  fp:这是个文件指针,指出要将数据写入的文件。
  format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
4.返回值
  无。
5. 实例

【8.5】下列程序的执行文件为display.exe,执行时键入命令行:
   display [-i][-s] filename
下面的表格列出了命令行参数的含义及其功能:

 21:30:17
//存储文件名:save.txt
//程序代码如下:
// file display program.
#include <stdio.h>
void main()
{
    char name[10];
    int nAge,nClass;
    long number;
    FILE *fp;
    if((fp=fopen("student.txt","w"))==NULL)
    {
        printf("The file %s can not be opened.\n","student.txt");
        return;
    }
    fscanf(stdin,"%s %d %d %ld",name,&nClass,&nAge,&number);
    fprintf(fp,"%s %5d %4d %8ld",name,nClass,nAge,number);
    fclose(fp);
    if((fp=fopen("student.txt","r"))==NULL)
    {
        printf("The file %s can not be opened.\n","student.txt");
        return;
    }
    fscanf(fp,"%s %d %d %ld",name,&nClass,&nAge,&number);
    printf("name nClass nAge number\n");
    fprintf(stdout,"%-10s%-8d%-6d%-8ld\n",name,nClass,nAge,number);
    fclose(fp);
}

 21:30:17
功能说明
  从由fp指定的文件中,按二进制形式将sife*count个数据读到由buffer指出的数据区中。
3. 参数说明
buffer:这是一个void型指针,指出要将读入数据存放在其中的存储区首地址。
sife:指出一个数据块的字节数,即一个数据块的大小尺寸。
count:指出一次读入多少个数据块(sife)。
fp:这是个文件指针,指出要从其中读出数据的文件。
4.返回值
  正常返回:实际读取数据块的个数,即count。
  异常返回:如果文件中剩下的数据块个数少于参数中count指出的个数,或者发生了错误,返回0值。此时可以用feof()和ferror()来判定到底出现了什么
情况。

H. 以二进制形式写数据到文件中去

作业:#include <stdio.h>
int main()
{
    int n,i;
    double sum;
    scanf("%d",&n);
    sum=0;
    for(i=1;i<=n;i++){
      sum+=1/(double)i;
    }
    printf("sum = %.6f\n",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值