计算机编程 - 文件 I/O



计算机文件

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

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

文件输入/输出

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

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

目前,记住写入文件是文件输入,从文件读取内容是文件输出就足够了。

文件操作模式

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

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

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

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

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

在接下来的部分中,我们将学习如何打开一个新的文件,如何向其中写入内容,以及随后如何读取和追加更多内容到同一个文件中。

打开文件

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

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

这里,filename是字符串文字,您将使用它来命名您的文件,并且access mode可以具有以下值之一:

序号 模式及描述
1

r

以读取目的打开现有文本文件。

2

w

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

3

a

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

4

r+

打开文本文件以进行读取和写入。

5

w+

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

6

a+

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

关闭文件

要关闭文件,请使用fclose( )函数。此函数的原型为:

 int fclose( FILE *fp );

fclose( )函数在成功时返回零,或者在关闭文件时出错时返回EOF特殊字符。此函数实际上将缓冲区中仍挂起的所有数据刷新到文件,关闭文件并释放用于文件的任何内存。EOF 是在头文件stdio.h中定义的常量。

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

写入文件

以下是将单个字符写入流的最简单函数:

int fputc( int c, FILE *fp );

fputc()函数将参数 c 的字符值写入由fp引用的输出流。如果成功,它将返回写入的字符,否则如果发生错误,则返回EOF。您可以使用以下函数将以 null 结尾的字符串写入流:

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中,并附加一个null字符以终止字符串。

如果此函数在读取最大字符数之前遇到换行符'\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...
广告