计算机编程 - 文件 I/O


电脑文件

计算机文件用于存储数字格式的数据,如纯文本、图像数据或任何其他内容。计算机文件可以组织在不同的目录中。文件用于保存数字数据,而目录用于保存文件。

计算机文件可以被视为纸质文档的数字副本。编程时,您将源代码保存在具有不同扩展名的文本文件中,例如,C 编程文件以扩展名.c结尾,Java 编程文件以.java结尾,Python 文件以.py结尾。

文件输入/输出

通常,您使用记事本、MS Word、MS Excel 或 MS Powerpoint 等文本编辑器创建文件。但是,很多时候,我们也需要使用计算机程序创建文件。我们可以使用计算机程序修改现有文件。

文件输入是指写入文件的数据,文件输出是指从文件中读取的数据。实际上,输入和输出术语更多地与屏幕输入和输出相关。当我们在屏幕上显示结果时,称为输出。同样,如果我们从命令提示符向程序提供一些输入,那么它就称为输入。

现在,只要记住写入文件是文件输入,从文件读取内容是文件输出就足够了。

文件操作模式

在我们开始使用计算机程序处理任何文件之前,我们需要创建一个新文件(如果不存在)或打开一个已经存在的文件。在任何一种情况下,我们都可以用以下模式打开文件 -

  • 只读模式- 如果您只想读取现有文件并且不想在文件中写入任何其他内容,那么您将以只读模式打开该文件。几乎所有编程语言都提供以只读模式打开文件的语法。

  • 只写模式- 如果您要写入现有文件或新创建的文件,但不想从该文件读取任何写入内容,那么您将以只写模式打开该文件。所有编程语言都提供以只写模式打开文件的语法。

  • 读取和写入模式- 如果您要读取并写入同一个文件,那么您将以读取和写入模式打开文件。

  • 附加模式- 当您打开文件进行写入时,它允许您从文件的开头开始写入;但是,它将覆盖现有内容(如果有)。假设我们不想覆盖任何现有内容,那么我们以追加模式打开文件。追加模式本质上是一种写​​入模式,它允许将内容追加到文件末尾。几乎所有编程语言都提供以追加模式打开文件的语法。

在下面的部分中,我们将学习如何打开一个新文件,如何写入文件,以及如何读取更多内容并将其附加到同一文件中。

打开文件

您可以使用fopen()函数创建新文件或打开现有文件。此调用将初始化FILE类型的对象,其中包含控制流所需的所有信息。这是原型,即该函数调用的签名 -

FILE *fopen( const char * filename, const char * mode );

在这里,文件名是字符串文字,您将使用它来命名文件,并且访问模式可以具有以下值之一 -

先生编号 模式及说明
1

r

打开现有文本文件以供阅读。

2

w

打开文本文件进行写入。如果不存在,则创建一个新文件。在这里,您的程序将从文件的开头开始写入内容。

3

A

打开文本文件以追加模式写入。如果不存在,则创建一个新文件。在这里,您的程序将开始在现有文件内容中附加内容。

4

r+

打开一个文本文件以进行读写。

5

瓦+

打开文本文件以进行读取和写入。它首先将文件截断为零长度(如果存在);否则,如果文件不存在,则创建该文件。

6

一个+

打开文本文件以进行读取和写入。如果文件不存在,它会创建一个文件。阅读会从头开始,但写作只能追加。

关闭文件

要关闭文件,请使用fclose( )函数。该函数的原型是 -

 int fclose( FILE *fp );

fclose ( )函数成功时返回零,如果关闭文件时出错,则返回EOF (特殊字符)。该函数实际上将缓冲区中仍待处理的所有数据刷新到文件,关闭文件,并释放用于该文件的所有内存。EOF 是头文件stdio.h中定义的常量。

C 标准库提供了各种函数来逐个字符或以固定长度字符串的形式读写文件。让我们在下一节中看看其中的一些。

写入文件

下面给出的是将单个字符写入流的最简单的函数 -

int fputc( int c, FILE *fp );

函数fputc()将参数 c 的字符值写入fp引用的输出流。成功时返回写入的字符,如果出现错误则返回EOF 。您可以使用以下函数将空终止字符串写入流 -

int fputs( const char *s, FILE *fp );

函数fputs()将字符串s写入 fp 引用的文件中。成功时返回一个非负值,否则如果出现任何错误,则返回EOF 。您还可以使用函数int fprintf(FILE *fp,const char *format, ...)将字符串写入文件。尝试以下示例 -

#include <stdio.h>

int main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

当上面的代码被编译并执行时,它会在/tmp目录中创建一个新文件test.txt并使用两个不同的函数写入两行。让我们在下一节中阅读该文件。

读取文件

下面给出的是逐个字符读取文本文件的最简单的函数 -

int fgetc( FILE * fp );

fgetc ()函数从fp引用的输入文件中读取一个字符。返回值是读取到的字符;或者如果出现任何错误,它会返回EOF。以下函数允许您从流中读取字符串 -

char *fgets( char *buf, int n, FILE *fp );

函数fgets()从fp引用的输入流中读取最多 n - 1 个字符。它将读取的字符串复制到缓冲区buf中,并附加一个字符来终止该字符串。

如果此函数在读取最大字符数之前遇到换行符 '\n' 或 EOF,则它仅返回到该点读取的字符(包括换行符)。您还可以使用int fscanf(FILE *fp, const char *format, ...)从文件中读取字符串,但它在遇到第一个空格字符后停止读取。

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
}

当上面的代码被编译和执行时,它会读取上一节中创建的文件并产生以下结果 -

1 : This
2 : is testing for fprintf...

3 : This is testing for fputs...

我们来分析一下这里发生了什么。首先,fscanf()方法读取This,因为之后它遇到了空格。第二次调用是fgets(),它读取剩余的行,直到遇到行尾。最后,最后一次调用fgets()完整读取第二行。

Java 中的文件 I/O

Java 提供了更丰富的函数集来处理文件 I/O。有关此主题的更多信息,我们建议您查看我们的 Java 教程。

在这里,我们将看到一个简单的Java程序,它相当于上面解释的C程序。该程序将打开一个文本文件,向其中写入几行文本,然后关闭该文件。最后,打开同一个文件,然后从已创建的文件中读取。您可以尝试执行以下程序来查看输出 -

import java.io.*;

public class DemoJava {
   public static void main(String []args) throws IOException {
      File file = new File("/tmp/java.txt");
      
      // Create a File
      file.createNewFile();
      
      //  Creates a FileWriter Object using file object
      FileWriter writer = new FileWriter(file); 
      
      // Writes the content to the file
      writer.write("This is testing for Java write...\n");
      writer.write("This is second line...\n");
      
      // Flush the memory and close the file
      writer.flush();
      writer.close();
      
      // Creates a FileReader Object
      FileReader reader = new FileReader(file); 
      char [] a = new char[100];
      
      // Read file content in the array
      reader.read(a);
      System.out.println( a );
      
      // Close the file
      reader.close();
   }
}

执行上述程序时,会产生以下结果 -

This is testing for Java write...
This is second line...

Python 中的文件 I/O

以下程序显示了打开新文件、向其中写入一些内容,最后读取同一文件的相同功能 -

# Create a new file
fo = open("/tmp/python.txt", "w")

# Writes the content to the file
fo.write( "This is testing for Python write...\n");
fo.write( "This is second line...\n");

# Close the file
fo.close()

# Open existing file
fo = open("/tmp/python.txt", "r")

# Read file content in a variable
str = fo.read(100);
print str

# Close opened file
fo.close()

执行上述代码时,会产生以下结果 -

This is testing for Python write...
This is second line...