📜  计算机编程-文件I / O

📅  最后修改于: 2021-01-18 06:29:02             🧑  作者: Mango


电脑档案

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

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

文件输入/输出

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

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

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

文件操作模式

开始使用计算机程序处理任何文件之前,我们需要先创建一个不存在的新文件,或者打开一个已经存在的文件。无论哪种情况,我们都可以通过以下方式打开文件-

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

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

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

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

在以下各节中,我们将学习如何打开一个新文件,如何将其写入文件,以及以后如何在同一文件中读取和附加更多内容。

开启档案

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

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

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

Sr.No Mode & Description
1

r

Opens an existing text file for reading purpose.

2

w

Opens a text file for writing. If it does not exist, then a new file is created. Here, your program will start writing content from the beginning of the file.

3

a

Opens a text file for writing in appending mode. If it does not exist, then a new file is created. Here, your program will start appending content in the existing file content.

4

r+

Opens a text file for reading and writing both.

5

w+

Opens a text file for both reading and writing. It first truncates the file to zero length, if it exists; otherwise creates the file if it does not exist.

6

a+

Opens a text file for both reading and writing. It creates a file, if it does not exist. The reading will start from the beginning, but writing can only be appended.

关闭档案

要关闭文件,请使用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 

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 

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...