基本操作示例
1#include <stdio.h> // 引入标准输入输出头文件,包含文件操作所需的函数原型
2
3int main(void) {
4 // **1. 打开文件**
5 // 定义一个FILE类型的文件指针fp
6 FILE *fp;
7
8 // 使用fopen函数打开文件,接收两个参数:文件路径和打开模式
9 fp = fopen("example.txt", "w"); // 打开名为"example.txt"的文件,以写入模式("w")打开
10
11 // 检查文件是否成功打开,如果fp为NULL,则表示打开失败
12 if (fp == NULL) {
13 fprintf(stderr, "Error opening file\n");
14 return 1; // 返回非零值表示程序运行出错
15 }
16
17 // **2. 写入文件**
18 // 使用fprintf函数向文件写入数据,格式类似于printf,但第一个参数为文件指针
19 fprintf(fp, "Hello, World!\n"); // 向文件写入一行文本
20
21 // **3. 关闭文件**
22 // 使用fclose函数关闭已打开的文件,接收一个参数:文件指针
23 if (fclose(fp) != 0) { // fclose返回0表示成功关闭,非零值表示关闭失败
24 fprintf(stderr, "Error closing file\n");
25 return 1; // 返回非零值表示程序运行出错
26 }
27
28 printf("File operation completed successfully.\n");
29 return 0; // 返回0表示程序正常运行完毕
30}
上述代码展示了如何使用C语言进行基本的文件操作:
- 定义一个
FILE
类型的指针fp
。 - 使用
fopen()
函数打开文件,指定文件路径为"example.txt"
,以写入模式("w"
)打开。检查返回的fp
是否为NULL
,判断文件是否成功打开。 - 使用
fprintf()
函数向文件写入数据,格式类似于printf()
,但第一个参数为文件指针fp
。 - 使用
fclose()
函数关闭已打开的文件,接收一个参数:文件指针fp
。同样检查返回值判断关闭操作是否成功。
这段代码仅演示了文件的打开、写入和关闭操作。对于文件的读取、定位、追加等其他操作
fopen
()
fopen()
是C语言中用于打开文件并创建指向该文件的文件指针的函数。它允许您以特定模式(如读取、写入、追加等)访问文件,并为后续的文件操作(如读取、写入、定位等)建立必要的上下文。以下是关于 fopen()
函数的详细说明及代码示例:
函数原型
1FILE *fopen(const char *filename, const char *mode);
参数说明
-
filename
:指向包含文件路径和名称的字符串常量。它可以是相对路径(相对于当前工作目录)或绝对路径。 -
mode
:指向描述如何打开文件以及用于何种目的的字符串常量。常见的模式包括:-
"r"
:打开文件以只读方式。文件必须存在,否则打开失败。试图写入这样的文件会导致错误。 -
"w"
:打开文件以写入方式。如果文件存在,其内容将被截断(清空);如果文件不存在,将创建新文件。 -
"a"
:打开文件以追加方式。所有写入操作都在文件末尾进行,不会覆盖现有内容。如果文件不存在,将创建新文件。 -
"r+"
:打开文件以读写方式。文件必须存在。可以读取和修改文件内容,但不会自动定位到文件末尾。 -
"w+"
:打开文件以读写方式。如果文件存在,其内容将被截断;如果文件不存在,将创建新文件。 -
"a+"
:打开文件以读写追加方式。可以读取文件内容和在文件末尾添加数据,但不能覆盖文件已有的内容。如果文件不存在,将创建新文件。
-
返回值
-
成功打开文件时,
fopen()
返回一个指向FILE
结构体的指针,该结构体包含了与打开文件相关的内部信息,如文件位置、缓冲区等。这个指针通常被传递给其他文件操作函数(如fread()
,fwrite()
,fseek()
,fclose()
等)。 -
如果无法打开文件(例如,由于权限问题、文件不存在且无法创建、磁盘空间不足等),
fopen()
返回NULL
。在这种情况下,应检查返回值并采取适当措施,如打印错误消息、终止程序或尝试不同的打开模式。
示例
1#include <stdio.h>
2#include <stdlib.h>
3
4int main(void) {
5 const char *filename = "example.txt";
6 const char *mode = "w";
7 FILE *file;
8
9 file = fopen(filename, mode);
10 if (file == NULL) {
11 fprintf(stderr, "Failed to open file '%s'\n", filename);
12 exit(EXIT_FAILURE);
13 }
14
15 // 文件已成功打开,现在可以进行写入操作
16 fprintf(file, "Hello, World!\n");
17
18 // 完成文件操作后,记得关闭文件
19 fclose(file);
20
21 return 0;
22}
在这个示例中,我们使用 fopen()
打开名为 "example.txt" 的文件,以写入模式 ("w"
) 创建或清空文件。如果打开成功,我们将字符串 "Hello, World!" 写入文件,并在完成所有操作后使用 fclose()
关闭文件。如果 fopen()
失败(返回 NULL
),程序将打印错误消息并退出。
以下是一些常用的文件写入函数及其用法:
1. fprintf()
fprintf()
函数类似于printf()
,用于向指定的文件写入格式化的数据。其语法如下:
1int fprintf(FILE *stream, const char *format, ...);
示例:
1fprintf(fp, "%s: %.2f\n", "Temperature", 25.¾);
此例中,fp
为指向已打开文件的指针,"%s: %.2f\n"
为格式字符串,后面的参数对应格式化占位符。这条语句将字符串"Temperature"
和浮点数25.¾
按照指定格式写入文件。
2. fputs()
fputs()
函数用于将一个字符串(包括结尾的空字符)写入文件。其语法如下:
1int fputs(const char *str, FILE *stream);
示例:
1char str[] = "Hello, World!";
2fputs(str, fp);
此例中,str
为要写入的字符串,fp
为指向已打开文件的指针。fputs()
将整个字符串"Hello, World!"
写入文件。
3. fwrite()
fwrite()
函数用于将二进制数据块写入文件。其语法如下:
1size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
示例:
1int data[] = {1, 2, 3, 4, 5};
2fwrite(data, sizeof(int), sizeof(data) / sizeof(int), fp);
此例中,data
为指向要写入数据的指针,sizeof(int)
为每个数据元素的大小,sizeof(data) / sizeof(int)
为数据元素数量,fp
为指向已打开文件的指针。fwrite()
将整型数组data
的内容作为一个二进制数据块写入文件。
4. putc()
和 fputc()
putc()
和fputc()
函数用于向标准输出或指定文件写入单个字符。两者区别在于putc()
默认写入标准输出(stdout
),而fputc()
接收一个额外的文件指针参数。其语法分别为:
1. putc()
putc()
函数向指定的输出流(通常默认为标准输出 stdout
)写入一个字符。其原型为:
1int putc(int c, FILE *stream);
其中,c
是要写入的字符(其ASCII值或扩展ASCII值),stream
是指向目标输出流的文件指针。如果成功写入字符,putc()
返回写入的字符;若发生错误,则返回 EOF
。
示例:
1#include <stdio.h>
2
3int main(void) {
4 int character = 'A';
5
6 putc(character, stdout); // 输出单个字符 'A' 到标准输出
7
8 return 0;
9}
在这个例子中,putc(character, stdout)
将字符 'A'
直接输出到标准输出(屏幕)。运行程序后,屏幕上会显示:
Code
1A
2. fputc()
fputc()
函数与 putc()
功能相似,也是向指定的输出流写入一个字符,但它的使用更加明确地指向文件操作。其原型为:
1int fputc(int c, FILE *stream);
参数含义与 putc()
相同:c
是要写入的字符,stream
指向目标输出流。成功写入字符时返回该字符,出错时返回 EOF
。
示例:
1#include <stdio.h>
2
3int main(void) {
4 int character = 'B';
5 FILE *output_file = fopen("example.txt", "w");
6
7 if (output_file == NULL) {
8 fprintf(stderr, "Failed to open file\n");
9 return 1;
10 }
11
12 fputc(character, output_file); // 将字符 'B' 写入文件
13
14 fclose(output_file);
15
16 return 0;
17}
在这个例子中,fputc(character, output_file)
将字符 'B'
写入已打开的文件 output_file
。查看生成的 example.txt
文件内容,会看到:
Code
1B
只有一个字符 'B'
。
5. puts()
和 fputs()
的区别
尽管名字相似,puts()
和fputs()
在功能上有一定差异:
1. puts()
puts()
函数向标准输出(通常是终端屏幕)写入一个字符串,并在字符串末尾自动添加一个换行符(\n
)。其语法如下:
1int puts(const char *str);
示例:
1#include <stdio.h>
2
3int main(void) {
4 const char *message = "Hello, World!";
5
6 puts(message); // 输出 "Hello, World!\n"
7
8 return 0;
9}
在这个例子中,puts(message)
将字符串 message
输出到标准输出(屏幕),并在末尾自动添加一个换行符。执行程序后,终端会显示:
Code
1Hello, World!
2. fputs()
fputs()
函数则允许您向任意已打开的文件指针(而非仅限标准输出)写入一个字符串,且不自动添加换行符。其语法如下:
1int fputs(const char *str, FILE *stream);
示例:
1#include <stdio.h>
2
3int main(void) {
4 const char *message = "Hello, World!";
5 FILE *output_file = fopen("example.txt", "w");
6
7 if (output_file == NULL) {
8 fprintf(stderr, "Failed to open file\n");
9 return 1;
10 }
11
12 fputs(message, output_file); // 将字符串写入文件,不添加换行符
13
14 fclose(output_file);
15
16 return 0;
17}
在这个例子中,fputs(message, output_file)
将字符串 message
写入已打开的文件 output_file
,但不会添加换行符。查看生成的 example.txt
文件内容,只会看到:
Code
1Hello, World!
没有额外的换行符。
总结:
- 目标输出流:
puts()
仅能向标准输出(通常是终端屏幕)写入字符串,而fputs()
可以向任何已打开的文件指针(包括标准输入、标准输出、标准错误以及用户自定义的文件)写入字符串。 - 换行符:
puts()
在写入字符串后自动添加一个换行符,而fputs()
不会添加换行符。如果您需要在fputs()
后添加换行符,可以单独调用fputc('\n', stream)
或使用fprintf(stream, "%s\n", str)
。