C语言进行基本的文件操作

基本操作示例

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语言进行基本的文件操作:

  1. 定义一个FILE类型的指针fp
  2. 使用fopen()函数打开文件,指定文件路径为"example.txt",以写入模式("w")打开。检查返回的fp是否为NULL,判断文件是否成功打开。
  3. 使用fprintf()函数向文件写入数据,格式类似于printf(),但第一个参数为文件指针fp
  4. 使用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)
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值