北航刷题笔记 其六

7.I/O和文件操作

1.文件:

读取文件:FILE *filea=fopen(“ “)(filea是给这个文件定义的名字,相当于变量名)

关闭文件(最后):fclose(“filea”)

1. 文件的打开 (fopen)

fopen 是用来打开一个文件并返回一个文件指针的函数。文件指针是指向文件的一个指针,用来在文件中进行读写操作。

函数原型:

1
2
3
4
5
c


复制编辑
FILE *fopen(const char *filename, const char *mode);
  • filename: 要打开的文件名。
  • mode: 打开文件的模式,决定了你如何读取、写入或修改该文件。

常见的打开模式:

  • "r": 只读模式。文件必须存在,文件指针指向文件开头。
  • "w": 只写模式。如果文件存在,文件内容会被清空;如果文件不存在,会创建新文件。
  • "a": 追加模式。如果文件存在,数据会被写入文件末尾;如果文件不存在,会创建新文件。
  • "r+": 读写模式。文件必须存在,文件指针指向文件开头。
  • "w+": 读写模式。如果文件存在,文件内容会被清空;如果文件不存在,会创建新文件。
  • "a+": 读写追加模式。如果文件存在,数据会被追加到文件末尾;如果文件不存在,会创建新文件。

示例:

1
2
3
4
5
c


复制编辑
FILE *file = fopen("example.txt", "r");

上面的代码会打开名为 example.txt 的文件,并以只读模式打开。如果文件不存在,fopen 会返回 NULL

2. 文件的关闭 (fclose)

fclose 用来关闭文件。每当你完成了文件的操作后,应该调用 fclose 来关闭文件。这样做可以释放操作系统资源,并确保文件数据正确写入。

函数原型:

1
int fclose(FILE *stream);
  • stream: 要关闭的文件的指针。

如果成功关闭文件,fclose 返回 0;如果关闭失败,返回 EOF

示例:

1
fclose(file);

在完成对 file 文件的操作后,调用 fclose 关闭该文件。

3. 文件的读取 (fgetcfgets)

读取文件内容时,我们常用的函数是 fgetcfgets

fgetc

fgetc 用来从文件中读取单个字符,并返回该字符。如果已经读取到文件末尾,返回 EOF

函数原型:

1
int fgetc(FILE *stream);
  • stream: 要读取的文件指针。

示例:

1
char ch = fgetc(file);

上面的代码会从 file 文件中读取一个字符,并将其存储在 ch 中。如果已经读取到文件末尾,fgetc 会返回 EOF

fgets

fgets 用来读取一行文本,直到遇到换行符或达到指定的字符数为止。它比 fgetc 更适合读取一整行。

函数原型:

1
char *fgets(char *str, int num, FILE *stream);
  • str: 存储读取到的字符的数组。
  • num: 最多读取的字符数(包括 \0)。
  • stream: 要读取的文件指针。

示例:

1
2
char line[100];
fgets(line, 100, file);

这段代码从 file 中读取最多 100 个字符,并将其存储在 line 数组中,直到遇到换行符或达到 100 字符为止。

4. 文件的写入 (fputcfputs)

文件写入时,我们常用的函数是 fputcfputs

fputc

fputc 用来向文件写入单个字符。

函数原型:

1
int fputc(int c, FILE *stream);
  • c: 要写入的字符(以整数形式表示)。
  • stream: 要写入的文件指针。

示例:

1
fputc('A', file);

这段代码会向 file 写入字符 'A'

fputs

fputs 用来写入一个字符串。

函数原型:

1
int fputs(const char *str, FILE *stream);
  • str: 要写入的字符串。
  • stream: 要写入的文件指针。

示例:

1
fputs("Hello, World!", file);

这段代码会向 file 写入字符串 "Hello, World!"

5. 文件的错误处理

  • 检查文件是否成功打开fopen 如果返回 NULL,表示文件打开失败。
  • 检查文件读写操作是否成功:在读取或写入文件时,返回 EOF 可能表示发生了错误。

例如:

1
2
3
if (file == NULL) {
printf("Error opening file!\n");
}

6. 文件指针与文件缓冲区

文件在操作时通常使用缓冲区。文件指针指向当前操作文件中的位置。你可以使用 fseekftell 等函数来操作文件指针的位置。

fseek

用于移动文件指针。

ftell

返回文件指针当前的位置。

示例:

1
2
fseek(file, 0, SEEK_SET);  // 将文件指针移动到文件开头
long pos = ftell(file); // 获取当前文件指针的位置

总结:

  • fopen 用于打开文件并返回文件指针。
  • fgetcfgets 用于读取文件内容。
  • fputcfputs 用于向文件写入内容。
  • fclose 用于关闭文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>

int main() {
FILE *in, *out;
char infile[10], outfile[10];
char ch;

// 读取源文件和目标文件的文件名
scanf("%s %s", infile, outfile);

// 打开源文件
in = fopen(infile, "r");
if (in == NULL) {
printf("can not open infile\n");
return 0;
}

// 打开目标文件
out = fopen(outfile, "w");
if (out == NULL) {
printf("can not open outfile\n");
fclose(in); // 关闭已经打开的源文件
return 0;
}

// 将源文件内容写入目标文件
while ((ch = fgetc(in)) != EOF) {
fputc(ch, out);
}

// 关闭文件
fclose(in);
fclose(out);

return 0;
}