C语言 文件I/O

C语言 文件I/O

在这篇文章中,你将学习什么是C语言中的文件,为什么需要它们,以及如何在C语言中借助不同的C语言函数,如fopen()、fclose()、fprintf()、fscanf()、getc()、putc()、getw()、fseek()等处理标准I/O。一个文件代表一个字节序列,无论它是一个文本文件还是一个二进制文件。

一个文件是用来存储巨大的数据。C语言提供了多种文件管理功能,如创建文件、打开和读取文件、向文件写入和关闭文件。文件用于存储相关数据,C语言中的文件处理则用于操作数据。

文件的类型

主要有两种类型的文件可以用C语言中的文件处理来处理。

1.Text Files: 这些是简单的文本文件,以(.txt)为扩展名保存,可由任何文本编辑器创建或修改。文本文件以ASCII字符的形式存储数据,用于存储字符流。

2.二进制文件: 它是以二进制格式而不是ASCII字符存储的。二进制文件通常用于存储数字信息(int, float, double)。这里的数据是以二进制形式存储的,即(0和1)。

可以对一个文件进行的不同操作是。

1.创建一个新文件(fopen,属性为 “a “或 “a+”或 “w “或 “w+”)。
2.打开一个现有的文件(fopenopen)。
3.从文件读取(fscanf或fgets)。
4.用fprintf或fputs向文件写入。
5.将与某一文件相关的文件指针移动到一个特定的位置。(fseek, rewind).
6.关闭一个文件(关闭)。

为了对文件进行操作,使用了一个特殊的指针,称为文件指针,它可以被声明为。

FILE file_ptr

我们可以用以下方式打开该文件

file_ptr = fopen("fileName.txt", "w")

第二个参数,即 “w”,可以根据下表改变。

开幕式模式 描述
r 搜索文件。如果文件被成功打开,fopen( )将其加载到内存中,并设置一个指针,指向其中的第一个字符。如果文件不能被打开,fopen( )则返回NULL。
rb 以二进制模式打开阅读。如果该文件不存在,那么fopen( )将返回NULL。
w 搜索文件。如果文件存在,内容会被覆盖。如果文件不存在,则创建一个新的文件。如果无法打开该文件,则返回NULL。
wb 以二进制模式打开,以供写入。如果文件存在,其内容将被覆盖,否则将创建文件。
a 搜索文件。如果文件被成功打开,fopen( ) 将其加载到内存中,并设置一个指针,指向其中的最后一个字符。如果该文件不存在,将创建一个新文件。如果无法打开文件,则返回NULL。
ab 以二进制模式打开进行追加。数据被添加到文件的末尾。如果一个文件不存在,将被创建。
r+ 搜索文件。成功打开后fopen( )将其加载到内存中,并设置一个指针,指向其中的第一个字符。如果它不能打开文件,则返回NULL。
rb+ 如果文件不存在,fopen( )返回NULL。
w+ 搜索文件。如果该文件存在,其内容将被覆盖。如果文件不存在,则创建一个新的文件。如果无法打开该文件,则返回NULL。
wb+ 在二进制模式下,对读和写都开放。如果文件存在,内容会被覆盖。如果文件不存在,它将被创建。
a+ 搜索文件。如果文件被成功打开,fopen( ) 将其加载到内存中,并设置一个指针,指向其中的最后一个字符。如果该文件不存在,将创建一个新文件。如果无法打开文件,则返回NULL。
ab+ 以二进制模式打开,用于阅读和追加。如果文件不存在,将创建一个文件。

如果你想处理二进制文件,那么像 “rb”、”wb”、”ab”、”rb+”、”r+b”、”wb+”、”w+b”、”ab+”、”a+b “等访问模式将被广泛使用。

在C语言中打开或创建一个文件

要在c语言中执行文件的打开和创建,我们可以使用stdio.h头文件中的fopen()函数。

语法:

p = fopen(“fileopen”, “mode”); 

示例:

p = fopen(“Hello.txt”, r); 

用C语言读写文本文件

fprintf()和fscanf()用于在C语言编程中读取和写入文本文件。它们需要一个指向结构FILE的指针,因为它们是print()和scanf()的文件版本。

// C program to write contents
// to the file
#include <stdio.h>
#include <stdlib.h>
 
// Driver code
int main()
{
  char str[20];
  FILE* ptr;
 
  ptr = fopen("Hello.txt", "w+");
   
  if (ptr == NULL)
  {
    printf("Error Occurred While writing to a text file !");
    exit(1);
  }
 
  printf("Enter String ");
  fgets(str, 80, stdin);
 
  fputs(str, ptr);
  fclose(ptr);
 
  return 0;
}

输出:

C - 文件I/O

上面的程序从用户那里获取一个字符串,并将其存储在text_file.text中。编译这个程序后,在C_Program文件夹中会创建一个名为temp_text.txt的文本文件。在该文件中,我们可以看到我们输入的字符串。

下面是读取文件内容的C语言程序。

// C program to read contents
// from the file
#include <stdio.h>
#include <stdlib.h>
 
// Driver code
int main()
{
  char str[80];
  FILE* ptr;
 
  ptr = fopen("Hello.txt", "r");
 
  if (ptr == NULL)
  {
    printf("Error While opening file");
         
    // if the pointer returns NULL
    // program will exit
    exit(1);
  }
   
  if(fgets(str, 80, ptr) != NULL)
  {
    puts(str);
  }
  fclose(ptr);
 
  return 0;
}

输出:

C - 文件I/O

读取和写入二进制文件

fread() 用于从二进制文件中读取,fwrite()用于向磁盘上的文件写入。

1.写入二进制文件

fwrite()函数需要四个参数:数据地址、要写入磁盘的数据大小、数据类型的数量、以及我们要写入的文件的一个指针。

语法:

fwrite(const void *ptr,size_of_elements,number_of_elements, FILE *a_file); 

下面是向二进制文件写入的C程序。

// C program to write to a
// binary file
#include <stdio.h>
#include <stdlib.h>
 
struct Num
{
  int n1, n2;
};
 
// Driver code
int main()
{
  int n;
  struct Num obj;
  FILE* fptr;
  if ((fptr = fopen("temp.bin", "wb")) == NULL)
  {
    printf("Error! opening file");
         
    // if file pointer returns NULL program
    // will exit
    exit(1);
  }
     
  for (n = 1; n < 10; n++)
  {
    obj.n1 = n;
    obj.n2 = 12 + n;
    fwrite(&obj, sizeof(struct Num),
           1, fptr);
  }
   
  fclose(fptr);
  return 0;
}

输出:

C - 文件I/O

解释: 在上述程序中,我们正在创建一个名为GFG.bin的新文件。以Num为名的结构已经声明了两个数字–n1,n2,并创建了一个名为obj的对象。在for循环中,我们使用fwrite()函数在文件中存储数值。第一个参数是obj的地址,第二个参数是定义的结构Num的大小。

因为我们只插入了obj的一个实例,所以第三个参数将是1。 fptr将指向存储数据的文件。最后,我们已经关闭了这个文件。

2.从二进制文件中读取

fread()函数也需要四个参数,与C语言编程中的fwrite()函数相似。

语法:

fread(const void *ptr,size_of_elements,number_of_elements, FILE *a_file); 

下面是读取二进制文件的C语言程序。

// C Program to Read from a
// binary file using fread()
#include <stdio.h>
#include <stdlib.h>
struct Num
{
    int n1, n2;
};
 
// Driver code
int main()
{
  int n;
  struct Num obj;
  FILE* fptr;
  if ((fptr = fopen("temp.bin", "rb")) == NULL)
  {
    printf("Error! opening file");
         
    // If file pointer will return NULL
    // Program will exit.
    exit(1);
  }
     
  // else it will return a pointer
  // to the file.
  for (n = 1; n < 10; ++n)
  {
    fread(&obj, sizeof(struct Num), 1, fptr);
    printf("n1: %d\tn2: %d\n", obj.n1, obj.n2);
  }
   
  fclose(fptr);
  return 0;
}

输出:

C - 文件I/O

解释: 在上面的程序中,我们已经读取了同一个文件GFG.bin,并逐个循环读取记录。我们从*fptr指向的文件中读取一条Num大小的记录到结构Num中。 我们会得到与前一个程序中插入的相同的记录。

将文件指针移到特定位置

fseek()和rewind()是C语言编程中的两个方法,可以用来移动文件指针。

1. fseek() 函数

fseek()函数用于将文件指针设置为指定的偏移量并将数据写入文件。

语法:

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

其中,

  • 当可以是SEEK_SET、SEEK_CUR和SEEK_END。
  • SEEK_END:它表示文件的结束。
  • SEEK_SET。它表示文件的开始。
  • SEEK_CUR:它表示文件指针的当前位置。

下面是实现fseek()的C语言程序。

// C program to implement
// fseek
#include <stdio.h>
#include <stdlib.h>
 
// Driver code
int main()
{
  char str[80];
  FILE* ptr;
 
  ptr = fopen("Hello.txt", "w+");
  fputs("Welcome to GeeksforGeeks", ptr);
 
  fseek(ptr, 11,  SEEK_SET);
  fputs("Programming  ", ptr);
  fclose(ptr);
   
  ptr = fopen("Hello.txt", "r+");
  if(fgets(str, 80, ptr) != NULL)
  {
    puts(str);
  }
 
  fclose(ptr);
  return 0;
}

输出:

C - 文件I/O

2 C语言中的rewind()

rewind()函数将文件指针设为文件的开头。

语法:

void rewind(FILE *stream); 

下面是实现rewind()的C语言程序。

// C program to implement
// rewind()
#include <stdio.h>
#include <stdlib.h>
 
// Driver code
int main()
{
  char str[200];
  FILE* ptr;
 
  ptr = fopen("Hello.txt", "w+");
  fputs("Welcome to GeeksforGeeks", ptr);
 
  fclose(ptr);
   
  ptr = fopen("Hello.txt", "r+");
  if(fgets(str, 200, ptr) != NULL)
  {
    puts(str);
  }
  rewind(ptr);
  if(fgets(str, 200, ptr) != NULL)
  {
    puts(str);
  }
 
  fclose(ptr);
  return 0;
}

输出:

C - 文件I/O

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程