亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 文件处理

C 文件处理

在本教程中,您将学习 C 中的文件处理。您将学习使用 fprintf()、fscanf()、fread()、fwrite()、fseek() 等在 C 中处理标准 I/O。例子。

文件是计算机存储设备中用于存储数据的容器。


为什么需要文件?


文件类型

在处理文件时,有两种类型的文件你应该知道:

  1. 文本文件
  2. 二进制文件

1。文本文件

文本文件是普通的 .txt 文件。您可以使用任何简单的文本编辑器(例如记事本)轻松创建文本文件。

当您打开这些文件时,您会以纯文本形式看到文件中的所有内容。您可以轻松编辑或删除内容。

它们需要最少的维护工作,易于阅读,提供的安全性最低,占用的存储空间更大。

2。二进制文件

二进制文件大多是 .bin 计算机中的文件。

它们不是以纯文本形式存储数据,而是以二进制形式(0 和 1)存储数据。

它们可以容纳更多的数据,不易读取,并且比文本文件提供更好的安全性。


文件操作

在 C 语言中,您可以对文件执行四种主要操作,无论是文本还是二进制文件:

  1. 创建一个新文件
  2. 打开现有文件
  3. 关闭文件
  4. 从文件读取信息和将信息写入文件

处理文件

处理文件时,需要声明文件类型的指针。文件和程序之间的通信需要这个声明。

FILE *fptr;

打开文件 - 用于创建和编辑

使用 fopen() 打开文件 stdio.h 中定义的函数 头文件。

在标准 I/O 中打开文件的语法是:

ptr = fopen("fileopen","mode");

例如,

fopen("E:\\cprogram\\newprogram.txt","w");

fopen("E:\\cprogram\\oldprogram.bin","rb");
标准 I/O 中的打开模式
模式 模式的含义 文件不存在期间
r 打开阅读。 如果文件不存在,fopen() 返回 NULL。
rb 以二进制方式打开读取。 如果文件不存在,fopen() 返回 NULL。
w 开放写作。 如果文件存在,则覆盖其内容。
如果文件不存在,则会创建它。
wb 以二进制模式打开写入。 如果文件存在,则覆盖其内容。
如果文件不存在,则会创建它。
a 打开以追加。
数据被添加到文件的末尾。
如果文件不存在,则创建该文件。
ab 以二进制模式打开以追加。
数据被添加到文件的末尾。
如果文件不存在,则创建该文件。
r+ 可读写。 如果文件不存在,fopen() 返回 NULL。
rb+ 以二进制方式打开读写。 如果文件不存在,fopen() 返回 NULL。
w+ 可读写。 如果文件存在,则覆盖其内容。
如果文件不存在,则会创建它。
wb+ 以二进制方式打开读写。 如果文件存在,则覆盖其内容。
如果文件不存在,则会创建它。
a+ 打开以供阅读和附加。 如果文件不存在,则创建该文件。
ab+ 以二进制模式打开以供读取和附加。 如果文件不存在,则创建该文件。

关闭文件

文件(文本和二进制文件)应该在读/写后关闭。

使用 fclose() 执行关闭文件 功能。

fclose(fptr);

这里,fptr 是与要关闭的文件关联的文件指针。


读取和写入文本文件

为了读取和写入文本文件,我们使用函数 fprintf()fscanf().

它们只是 printf() 的文件版本 和 scanf() .唯一的区别是 fprintf()fscanf() 需要一个指向结构 FILE 的指针。


示例1:写入文本文件

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   // use appropriate location if you are using MacOS or Linux
   fptr = fopen("C:\\program.txt","w");

   if(fptr == NULL)
   {
      printf("Error!");   
      exit(1);             
   }

   printf("Enter num: ");
   scanf("%d",&num);

   fprintf(fptr,"%d",num);
   fclose(fptr);

   return 0;
}

该程序从用户那里获取一个数字并存储在文件 program.txt 中 .

编译运行这个程序后,可以看到一个文本文件program.txt 在您的计算机的 C 驱动器中创建。打开文件可以看到输入的整数。


示例2:从文本文件中读取

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.txt","r")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   fscanf(fptr,"%d", &num);

   printf("Value of n=%d", num);
   fclose(fptr); 
  
   return 0;
}

该程序读取存在于 program.txt 中的整数 文件并将其打印到屏幕上。

如果您从 示例 1 成功创建了文件 , 运行这个程序会得到你输入的整数。

fgetchar() 等其他函数 , fputc() 等可以类似的方式使用。


二进制文件的读写

函数 fread()fwrite() 对于二进制文件,分别用于读取和写入磁盘上的文件。


写入二进制文件

要写入二进制文件,您需要使用 fwrite() 功能。这些函数有四个参数:

  1. 要写入磁盘的数据地址
  2. 要写入磁盘的数据大小
  3. 此类数据的数量
  4. 指向要写入的文件的指针。
fwrite(addressData, sizeData, numbersData, pointerToFile);

示例 3:使用 fwrite() 写入二进制文件

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      num.n1 = n;
      num.n2 = 5*n;
      num.n3 = 5*n + 1;
      fwrite(&num, sizeof(struct threeNum), 1, fptr); 
   }
   fclose(fptr); 
  
   return 0;
}

在这个程序中,我们新建一个文件program.bin 在C盘。

我们声明一个结构 threeNum 三个数字 - n1、n2 和 n3 ,并在main函数中定义为num。

现在,在 for 循环中,我们使用 fwrite() 将值存储到文件中 .

第一个参数取num的地址 第二个参数取结构 threeNum 的大小 .

因为我们只插入 num 的一个实例 ,第三个参数是1 .并且,最后一个参数 *fptr 指向我们存储数据的文件。

最后,我们关闭文件。


从二进制文件中读取

函数 fread() 也接受 4 个类似于 fwrite() 的参数 功能同上。

fread(addressData, sizeData, numbersData, pointerToFile);

示例 4:使用 fread() 从二进制文件中读取

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

在这个程序中,您读取了相同的文件 program.bin 并一一循环遍历记录。

简单来说,你读了一个threeNum threeNum的记录 *fptr 指向的文件的大小 进入结构 num .

您将获得在 示例 3 中插入的相同记录 .


使用 fseek() 获取数据

如果一个文件中有很多条记录,需要访问特定位置的一条记录,则需要遍历它之前的所有记录来获取该记录。

这会浪费大量的内存和操作时间。使用 fseek() 可以更轻松地获取所需数据 .

顾名思义,fseek() 将光标定位到文件中的给定记录。


fseek() 的语法

fseek(FILE * stream, long int offset, int whence);

第一个参数流是指向文件的指针。第二个参数是要查找的记录的位置,第三个参数指定偏移开始的位置。

fseek() 中的不同来源
从何而来 意义
SEEK_SET 从文件开头开始偏移。
SEEK_END 从文件末尾开始偏移。
SEEK_CUR 从文件中光标的当前位置开始偏移。

示例 5:fseek()

#include <stdio.h>
#include <stdlib.h>

struct threeNum
{
   int n1, n2, n3;
};

int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;

   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.
       exit(1);
   }
   
   // Moves the cursor to the end of the file
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);

   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
      fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
   }
   fclose(fptr); 
  
   return 0;
}

该程序将开始从文件 program.bin 中读取记录 以相反的顺序(从后到前)并打印出来。


C语言

  1. Java 文件类
  2. STL 文件简介
  3. Verilog 文件 IO 操作
  4. C - 文件 I/O
  5. C - 头文件
  6. C - 错误处理
  7. C++ 文件和流
  8. C++ 信号处理
  9. C# - 异常处理
  10. C# - 文件 I/O
  11. Python - 文件 I/O
  12. 什么是三角文件?