计算机编程 - 文件 I/O

计算机文件

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

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

文件输入/输出

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

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

现在,只需要记住写入文件是文件输入和读取来自文件的东西是文件输出.

文件操作模式

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

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

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

  • Read&写模式 : 如果你要阅读和写入同一个文件,那么你将在read& amp;写模式.

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

在以下部分中,我们将学习如何打开一个新的新文件,如何写入,以及后来如何阅读和附加更多内容到同一个文件.

打开文件

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

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

此处,文件名是字符串文字,您将用它来命名文件并访问模式可以具有以下值之一 :

Sr.NoMode&描述
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);
}

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

读取文件

下面给出了一个最简单的函数来逐字符读取文本文件;

 
 int fgetc(FILE * fp);

fgetc()函数从 fp 引用的输入文件中读取字符.返回值是读取的字符;如果有任何错误,则返回 EOF .以下函数允许您从流中读取字符串 :

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

函数 fgets() fp .它将读取的字符串复制到缓冲区 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...