文件相关操作(C语言)

 

文件:

一、文件分类

在程序设计中,我们一般谈的文件有两种:程序文件数据文件

1、程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀 为.exe)。

2、数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

以前大多数处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

二、文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀

三、文件类型

分为两类:

1、二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件

2、文本文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

文件操作:

一、文件的打开、关闭常用接口

1、文件的打开(使用fopen这个函数)

FILE* file;
file = fopen("文件名","方式");

    方式都有哪些呢?

 如果在后面附加 “b” ,则表示打开的是二进制文件

2、文件的关闭(使用fclose这个函数)

fclose(文件指针); 

二、C语言文件读、写操作常用接口

  • 1、读操作
  • fgetc 函数 (从指定文件读入一个字符)
fgetc(文件指针);
  • fread 函数(从指定文件读入一组数据)
fread(buffer, size, count, file);

这几个参数都是干什么的呢?

1、buffer 存放被读入数据的内存首地址

2、size 每个数据项的字节数

3、count 数据项个数

4、file 文件类型的指针,也就是从哪个文件中读

  • fscanf 函数(从指定的文件中格式化读入数据)
fscanf(文件指针,格式控制,地址表);

这些读文件的方式在代码里怎么运用呢?


#include<stdio.h>

int main()
{
   FILE *file;
   //1.txt 为 测试文件
   file = fopen("1.txt","r");

   char a;
   char b[3];
   int c;

   if(file != NULL){
       a = fgetc(file);
       fread(b,sizeof(char),3,file);
       fscanf(file,"%d",&c);
   }

   putchar(a);
   for(int i = 0; i < 3; i++){
       printf(" %c",b[i]);
   }
   printf(" %d",c);

   //一定不要忘了关闭文件
   fclose(file);
   return 0;
}

2、写操作

  • fputc 函数(将一个字符写到指定的文件中,若写成功返回以输出字符,否则返回 EOF)
fputc( int , FILE* );
  • fwrite 函数(将一组数据写到指定的文件中)
fwrite( buffer, size, count, file);

   这四个参数的含义同读操作里的fread函数的参数含义。

  • fprintf 函数(格式化写数据到指定的文件中)
fprintf(文件指针,格式控制,输出表);

文件的写操作在代码里又是如何体现的呢?


#include<stdio.h>

int main()
{
   FILE *file;
   //1.txt 为空
   file = fopen("1.txt","w+");

   char a0 = 'D';
   char b0[3] = {'e','m','o'};
   int c0 = 2;
   char a1;
   char b1[3];
   int c1;

   if(file != NULL){
       // 输出
       fputc(a0,file);
       fwrite(b0,sizeof(char),3,file);
       fprintf(file,"%d",c0);
       // 读写指针移动到文件开头
       rewind(file);
       // 读入
       a1 = fgetc(file);
       fread(b1,sizeof(char),3,file);
       fscanf(file,"%d",&c1);
   }
   // 打印结果
   putchar(a1);
   for(int i = 0; i < 3; i++){
       printf(" %c",b1[i]);
   }
   printf(" %d",c1);

   //一定不要忘了关闭文件
   fclose(file);
   return 0;
}

三、文件定位操作的常用接口

  • rewind 函数(将文件的读写指针移动到文件的开头)
rewind(文件指针);
  • fseek 函数(将文件的读写指针移动到文件的指定位置)
fseek(文件指针,偏移量,起始位置);

参数说明:

1、偏移量的类型为长整型

2、起始位置是指移动文件读写指针的参考位置,有以下三个值

  1. SEEK_SET 或 0       表示文件首
  2. SEEK_CUR 或 1       表示当前读写的位置
  3. SEEK_END 或 2       表示文件尾
  • ftell 函数(返回文件的当前读写位置,若出错返回(-1L))
ftell(文件指针);

附注

文件操作的一般流程很容易让人记混淆,这里我整理在一份代码里,方便记忆:

#include <stdio.h>
 
int main()
{
    FILE *fp;
    char ch ;    
    char buf[20]={'0'} ;
    int temp = 0;
 
    //以读的方式打开文件,同时判断是否打开成功
    if((fp = fopen("1.txt","r")) == NULL)
    {
        printf("Fail to Open file 0\n");
        return -1;
    }
 
    //获取文件中的数据
    while((ch = getc(fp)) != EOF)    
    {
        //假如文件中包含2,3,4则将其换为*
        if(ch == '2'||ch == '3'||ch == '4')
            buf[temp] = '*';
        else
            buf[temp] = ch;        
        temp ++;
    }

    //关闭文件
    if(fclose(fp) == EOF)
    {
        printf("Close fail\n");
        return -1;
    }
 
    //以写的方式打开文件
    if((fp = fopen("1.txt","w")) == NULL)
    {
        printf("Fail to Open file 1\n");
        return -1;
    }

    //将数据写入文件
    for(temp = 0;buf[temp]!= '0';temp++)
        putc(buf[temp],fp);

    //关闭文件
    if(fclose(fp) == EOF)
    {
        printf("Close fail\n");
        return -1;
    }
     
    return 0;
}
发布了83 篇原创文章 · 获赞 26 · 访问量 8691

猜你喜欢

转载自blog.csdn.net/lexiaoyao_0000/article/details/103994028