C语言文件处理基础


**文件处理**是指使用程序将数据存储到文件中的过程。在C语言中,程序使用文件处理将程序的结果和其他数据存储到文件中。此外,我们还可以从文件中提取/获取数据并在程序中使用它。

您可以在C语言文件中执行的操作包括:

  • 创建新文件

  • 打开现有文件

  • 从现有文件读取数据

  • 向文件写入数据

  • 将数据移动到文件中的特定位置

  • 关闭文件

使用fopen()创建或打开文件

fopen()函数用于在C语言中创建新文件或打开现有文件。fopen函数在**stdio.h**头文件中定义。

现在,让我们看看创建新文件或打开文件的语法。

file = fopen(“file_name”, “mode”)

这是在C语言中打开和创建文件的常用语法。

参数

file_name − 这是一个字符串,指定使用fopen方法要打开或创建的文件名。mode: 这是一个字符串(通常是一个字符),指定打开文件的模式。C语言中有多种打开文件的方式,我们将在本文后面学习所有这些方式。

何时会创建文件?

当fopen函数在指定位置找不到指定名称的文件时,它将创建一个新文件。否则,如果找到该文件,它将以指定的模式打开它。

让我们来看一个示例,这将使概念更清晰。假设我们使用fopen函数打开名为hello.txt的文件。语句如下:

file = fopen(“hello.txt”, “w”)

这将在当前目录中搜索名为hello.txt的文件。如果文件存在,它将打开该文件;否则,它将创建一个名为“hello.txt”的新文件,并以写入模式(使用“w”指定)打开它。

现在,让我们看看所有可用于读取或写入C语言文件的模式,并查看显示代码示例运行的代码片段。

**Mode = “r”** − 只读打开,此模式仅以读取目的打开文件,即只能查看内容,不能进行任何其他操作,例如编辑。

此模式无法创建新文件,如果我们尝试使用此模式创建新文件,则**open()返回NULL**。

示例

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "r")){
      printf("File opened successfully in read mode");
   }
   else
   printf("The file is not present! cannot create a new file using r mode");
   fclose(file);
   return 0;
}

输出

File opened successfully in read mode

我们在当前目录中创建了一个名为hello.txt的文件,但如果我们尝试访问其他文件,则输出将为“文件不存在!无法使用r模式创建新文件”。

**Mode = “rb”** − 以二进制模式打开以进行读取,此模式仅以二进制模式打开文件以进行读取,即只能查看内容,不能进行任何其他操作,例如编辑。

此模式无法创建新文件,如果我们尝试使用此模式创建新文件,则**open()返回NULL**。

示例

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("program.txt", "rb")){
      printf("File opened successfully in read mode");
   }
   else
   printf("The file is not present! cannot create a new file using rb mode");
   fclose(file);
   return 0;
}

输出

文件不存在!无法使用rb模式创建新文件

**Mode = “w”** − 只写打开,此模式将仅以写入方式打开当前目录中存在的,即无法执行读取操作。如果当前目录中不存在该文件,则程序将创建一个新文件并以写入方式打开它。

如果我们打开一个包含某些文本的文件,则内容将被覆盖。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("helo.txt", "w")){
      printf("File opened successfully in write mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

File opened successfully in write mode or a new file is created

您可以在这里看到,我们尝试打开目录中不存在的文件“helo.txt”,该函数仍然返回成功消息,因为它创建了一个名为“helo.txt”的文件。

**Mode = “wb”** − 以二进制模式打开以进行写入,此模式将仅以二进制写入模式打开当前目录中存在的,即无法执行读取操作。如果当前目录中不存在该文件,则程序将创建一个新文件并以二进制写入模式打开它。

如果我们打开一个包含某些文本的文件,则内容将被覆盖。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "wb")){
      printf("File opened successfully in write in binary mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

文件已成功以二进制写入模式打开或创建了一个新文件

**Mode = “a”** − 只追加打开,此模式将仅以写入方式打开当前目录中存在的,即无法执行读取操作。如果当前目录中不存在该文件,则程序将创建一个新文件并以写入方式打开它。如果我们打开一个包含某些文本的文件,则内容不会被覆盖;而是将新文本添加到文件中的现有文本之后。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "a")){
      printf("File opened successfully in append mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

File opened successfully in append mode or a new file is created

**Mode = “ab”** − 以二进制模式打开以进行追加,此模式将仅以二进制写入方式打开当前目录中存在的,即无法执行读取操作。如果当前目录中不存在该文件,则程序将创建一个新文件并以二进制写入模式打开它。

如果我们打开一个包含某些文本的文件,则内容不会被覆盖;而是将新文本添加到文件中的现有文本之后。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "ab")){
      printf("File opened successfully in append in binary mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

File opened successfully in append in binary mode or a new file is created

**Mode = “r+”** − 读写打开,此模式将同时用于读取和写入目的打开文件,即可以对文件执行读取和写入操作。

此模式无法创建新文件,如果我们尝试使用此模式创建新文件,则**open()返回NULL**。

如果我们打开一个包含某些文本的文件并写入某些内容,则内容将被覆盖。

示例

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "r+")){
      printf("File opened successfully in read and write both");
   }
   else
   printf("The file is not present! cannot create a new file using r+ mode");
   fclose(file);
   return 0;
}

输出

File opened successfully in read and write both

我们在当前目录中创建了一个名为hello.txt的文件,但如果我们尝试访问另一个文件,则输出将为“文件不存在!无法使用r+模式创建新文件”。

**Mode = “rb+”** − 以二进制模式打开以进行读取,此模式仅以二进制模式打开文件以进行读取,即只能查看内容,不能进行任何其他操作,例如编辑。

此模式无法创建新文件,如果我们尝试使用此模式创建新文件,则**open()返回NULL**。

如果我们打开一个包含某些文本的文件并写入某些内容,则内容将被覆盖。

示例

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("program.txt", "rb+")){
      printf("File opened successfully in read mode");
   }
   else
   printf("The file is not present! cannot create a new file using rb+ mode");
   fclose(file);
   return 0;
}

输出

The file is not present! cannot create a new file using rb+ mode

**Mode = “w+”** − 读写打开,此模式将打开当前目录中存在的用于写入和读取操作的文件。如果当前目录中不存在该文件,则程序将创建一个新文件并以读取和写入方式打开它。

如果我们打开一个包含某些文本的文件,则内容将被覆盖。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("helo.txt", "w+")){
      printf("File opened successfully in read-write mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

File opened successfully in read-write mode or a new file is created

您可以在这里看到,我们尝试打开目录中不存在的文件“helo.txt”,该函数仍然返回成功消息,因为它创建了一个名为“helo.txt”的文件。

Mode = “wb+”:以二进制模式打开以进行写入和读取,此模式将打开当前目录中存在的用于以二进制方式写入和读取的文件。

如果当前目录中不存在该文件,则程序将创建一个新文件并以二进制模式打开它以进行读取和写入。如果我们打开一个包含某些文本的文件,则内容将被覆盖。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "wb+")){
      printf("File opened successfully in read-write in binary mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

File opened successfully in read-write in binary mode or a new file is created

**Mode = “a+”** − 读写追加打开,此模式将同时用于读取和写入打开当前目录中存在的。如果当前目录中不存在该文件,则程序将创建一个新文件并以读取和写入方式打开它。

如果我们打开一个包含某些文本的文件,则内容不会被覆盖;而是将新文本添加到文件中的现有文本之后。

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "a+")){
      printf("File opened successfully in read-append mode or a new file is created");
   }
   else
   printf("Error!");
   fclose(file);
   return 0;
}

输出

文件已成功以读追加模式打开或创建了一个新文件

**Mode = “ab+”** − 以二进制模式打开以进行读写追加,此模式将同时用于以二进制方式读取和写入打开当前目录中存在的。如果当前目录中不存在该文件,则程序将创建一个新文件并以二进制模式打开它以进行读取和写入。如果我们打开一个包含某些文本的文件,则内容不会被覆盖;而是将新文本添加到文件中的现有文本之后。

示例

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "ab+")){
      printf("File opened successfully in read-append in binary mode or a new file is created");
   }
   else
   printf("Error!”);
   fclose(file);
   return 0;
}

输出

File opened successfully in read-append mode or a new file is created

从现有文件读取数据

我们可以使用fscanf()、fgets()和fgetc()函数在c语言中读取文件的内容。所有这些都用于读取文件的内容。让我们看看每个函数的工作原理:

fscanf()

fscanf()函数用于从文件中读取字符集,即字符串。当它读取完文件的所有内容时,它返回EOF。

语法

int fscanf(FILE *stream, const char *charPointer[])

参数

FILE *stream: the pointer to the opened file.
const char *charPointer[]: string of character.

示例

#include <stdio.h>
int main(){
   FILE * file;
   char str[500];
   if (file = fopen("hello.txt", "r")){
         while(fscanf(file,"%s", str)!=EOF){
         printf("%s", str);
      }
   }
   else
   printf("Error!”);
   fclose(file);
   return 0;
}

输出

LearnprogrammingattutorialsPoint

fgets()

C语言中的fget()函数用于从流中读取字符串。

语法

char* fgets(char *string, int length, FILE *stream)

参数

char *string: It is a string which will store the data from the string.
int length: It is an int which gives the length of string to be considered.
FILE *stream: It is the pointer to the opened file.

示例

#include <stdio.h>
int main(){
   FILE * file;
   char str[500];
   if (file = fopen("hello.txt", "r")){
      printf("%s", fgets(str, 50, file));
   }
   fclose(file);
   return 0;
}

输出

Learn programming at tutorials Point

fgetc()

C语言中的fgetc()函数用于从文件中返回单个字符。它从文件中获取一个字符,并在文件结尾返回EOF。

语法

char* fgetc(FILE *stream)

参数

FILE *stream: It is the pointer to the opened file.

示例

#include <stdio.h>
int main(){
   FILE * file;
   char str;
   if (file = fopen("hello.txt", "r")){
      while((str=fgetc(file))!=EOF)
      printf("%c",str);
   }
   fclose(file);
   return 0;
}

输出

Learn programming at tutorials Point

向C语言文件写入数据

我们可以使用fprintf()、fputs()、fputc()函数向C语言文件写入数据。所有这些都用于向文件写入内容。

让我们看看每个函数的工作原理:

fprintf()

fprintf()函数用于向文件写入数据。它将一组字符写入文件。

语法

int fprintf(FILE *stream, char *string[])

参数

FILE for *stream: It is the pointer to the opened file.
char *string[]: It is the character array that we want to write in the file.

示例

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "w")){
      if(fprintf(file, "tutorials Point”) >= 0)
      printf("Write operation successful");
   }
   fclose(file);
   return 0;
}

输出

Write operation successful

fputf()

C语言中的fputf()函数可用于向文件写入数据。它用于将一行(字符行)写入文件。

语法

int fputs(const char *string, FILE *stream)

参数

Constant char *string[]: It is the character array that we want to write in the file.
FILE for *stream: It is the pointer to the opened file.

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "w")){
      if(fputs("tutorials Point", file) >= 0)
      printf("String written to the file successfully...");
   }
   fclose(file);
   return 0;
}

输出

String written to the file successfully…

fputc()

fputc()函数用于向文件写入单个字符。

语法

int fputc(char character , FILE *stream)

参数

char character : It is the character that we want to write in the file.
FILE for *stream: It is the pointer to the opened file.

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   if (file = fopen("hello.txt", "w")){
      fputc('T', file);
   }
   fclose(file);
   return 0;
}

输出

‘T’ is written to the file.

fclose()

fclose()函数用于关闭打开的文件。我们应该在对文件执行操作后关闭该文件,以保存我们对其应用的操作。

语法

fclose(FILE *stream)

参数

FILE for *stream: It is the pointer to the opened file.

示例

 在线演示

#include <stdio.h>
int main(){
   FILE * file;
   char string[300];
   if (file = fopen("hello.txt", "a+")){
      while(fscanf(file,"%s", string)!=EOF){
         printf("%s", string);
      }
      fputs("Hello", file);
   }
   fclose(file);
   return 0;
}

输出

LearnprogrammingatTutorialsPoint

文件内容:

Learn programming at Tutorials PointHello

更新于: 2020年7月17日

20K+ 浏览量

开启你的职业生涯

完成课程获得认证

开始学习
广告