File I/O
计算机文件
计算机文件用于以数字格式存储数据,如纯文本,图像数据或任何其他内容。 可以在不同目录中组织计算机文件。 文件用于保存数字数据,而目录用于保存文件。
计算机文件可以被视为纸质文档的数字对应物。 编程时,将源代码保存在具有不同扩展名的文本文件中,例如,C编程文件以扩展名.c结尾,Java编程文件以.java结尾,Python文件以.py结尾。
File Input/Output
通常,您使用文本编辑器(如记事本,MS Word,MS Excel或MS Powerpoint等)创建文件。但是,很多时候,我们还需要使用计算机程序创建文件。 我们可以使用计算机程序修改现有文件。
文件输入表示写入文件的数据,文件输出表示从文件读取的数据。 实际上,输入和输出术语与屏幕输入和输出更相关。 当我们在屏幕上显示结果时,它被称为输出。 同样,如果我们从命令提示符为程序提供一些输入,那么它被称为输入。
现在,记住写入文件是文件输入并从文件中读取文件输出就足够了。
文件操作模式
在我们开始使用计算机程序处理任何文件之前,我们需要创建一个新文件(如果它不存在)或打开现有文件。 在任何一种情况下,我们都可以在以下模式下打开文件 -
Read-Only Mode - 如果您只想读取现有文件而又不想在文件中写入任何其他内容,则将以只读模式打开该文件。 几乎所有的编程语言都提供了以只读模式打开文件的语法。
Write-Only Mode - 如果要写入现有文件或新创建的文件但不想从该文件中读取任何书面内容,则将以只写模式打开该文件。 所有编程语言都提供了以只写模式打开文件的语法。
Read & Write Mode - 如果您要读取和写入同一文件,则将以读写模式打开文件。
Append Mode - 当您打开文件进行写入时,它允许您从文件的开头开始写入; 但是它会覆盖现有内容,如果有的话。 假设我们不想覆盖任何现有内容,那么我们以追加模式打开文件。 追加模式最终是一种写入模式,允许将内容附加到文件的末尾。 几乎所有的编程语言都提供了在附加模式下打开文件的语法。
在以下部分中,我们将学习如何打开一个全新的文件,如何写入它,以及后来如何阅读和添加更多内容到同一个文件中。
打开文件
您可以使用fopen()函数创建新文件或打开现有文件。 此调用将初始化FILE类型的对象,该对象包含控制流所需的所有信息。 这是原型,即此函数调用的签名 -
FILE *fopen( const char * filename, const char * mode );
这里, filename是字符串文字,您将使用它来命名文件,访问mode可以具有以下值之一 -
Sr.No | 模式和说明 |
---|---|
1 | r 打开现有文本文件以供阅读。 |
2 | w 打开文本文件进行写入。 如果它不存在,则创建一个新文件。 在这里,您的程序将开始从文件的开头编写内容。 |
3 | a 打开文本文件以便以附加模式写入。 如果它不存在,则创建一个新文件。 在这里,您的程序将开始在现有文件内容中附加内容。 |
4 | r+ 打开文本文件以进行读写。 |
5 | w+ 打开文本文件以进行读写。 它首先将文件截断为零长度(如果存在); 否则创建文件,如果它不存在。 |
6 | a+ 打开文本文件以进行读写。 如果文件不存在,它会创建一个文件。 读数将从头开始,但只能附加写入。 |
关闭一个文件 (Closing a File)
要关闭文件,请使用fclose( )函数。 这个功能的原型是 -
int fclose( FILE *fp );
如果在关闭文件时出错,则fclose( )函数在成功时返回零,或EOF ,特殊字符。 此函数实际上将缓冲区中仍未处理的任何数据刷新到文件,关闭文件,并释放用于该文件的所有内存。 EOF是头文件stdio.h定义的常量。
C标准库提供了各种功能,用于按字符或以固定长度字符串的形式读取和写入文件字符。 让我们在下一节中看到其中的一些。
写一个文件 (Writing a File)
下面给出了将单个字符写入流的最简单的功能 -
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 ,并使用两个不同的函数写入两行。 我们将在下一节中阅读此文件。
Reading a File
以下是按字符读取文本文件的最简单函数 -
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...