(10)文件操作

1. 文件指针的概念和定义

在 C 语言中,文件指针是一种特殊的指针,用于指向一个文件结构体。这个结构体包含了文件的各种信息,如文件名、文件状态、当前文件位置指针等。通过文件指针,程序可以对文件进行各种操作。

文件指针的定义形式如下:

FILE *fp;

这里FILE是一个在<stdio.h>头文件中定义的结构体类型,fp就是我们定义的文件指针变量。

2. 文件的打开方法、文件打开函数返回值的处理

文件打开函数 - fopen()

在 C 语言中,使用fopen()函数来打开文件。其基本语法如下:

FILE *fopen(const char *filename, const char *mode);
  • filename是要打开的文件的名称(包括路径,如果文件不在当前目录下)。例如:"data.txt"或者"C:/myfiles/data.bin"
  • mode是打开文件的模式,不同的模式决定了文件的操作方式,常见的模式如下:
    • 文本文件模式
      • "r":以只读方式打开文件,文件必须存在。
      • "w":以只写方式打开文件,如果文件存在则清空内容,如果文件不存在则创建新文件。
      • "a":以追加方式打开文件,在文件末尾添加内容,如果文件不存在则创建新文件。
      • "r+":以读写方式打开文件,文件必须存在。
      • "w+":以读写方式打开文件,先清空文件内容(如果存在)或创建新文件。
      • "a+":以读写方式打开文件,追加模式,文件不存在则创建。
    • 二进制文件模式:在上述模式字符串后添加"b",如"rb""wb""ab"等,表示以二进制方式操作文件。
文件打开函数返回值的处理

fopen()函数返回一个FILE *类型的指针,如果成功打开文件,则返回指向该文件的指针;如果打开文件失败,则返回NULL。因此,在打开文件后,应该检查返回值,以确保文件打开成功。例如:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    // 文件操作...
    fclose(fp);
    return 0;
}

在这个示例中,如果fopen()返回NULL,使用perror()函数输出错误信息,并返回EXIT_FAILURE表示程序执行失败。

3. 在程序中读写外部的文本文件或者二进制文件的方法

文本文件的读写
  • 读文本文件 - fgets()fscanf()函数
    • fgets()函数:用于从文件中读取一行字符串。其语法如下:
char *fgets(char *str, int n, FILE *stream);

str是存储读取字符串的字符数组,n是最多读取的字符数(包括'\0'),stream是文件指针。例如:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("text.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    char line[100];
    while (fgets(line, 100, fp)!= NULL) {
        printf("%s", line);
    }
    fclose(fp);
    return 0;
}
- **`fscanf()`函数**:类似于`scanf()`,但用于从文件中读取格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>

struct Student {
    char name[20];
    int age;
};

int main() {
    FILE *fp = fopen("students.txt", "r");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    struct Student student;
    while (fscanf(fp, "%s %d", student.name, &student.age)!= -1) {
        printf("姓名: %s, 年龄: %d\n", student.name, student.age);
    }
    fclose(fp);
    return 0;
}
  • 写文本文件 - fputs()fprintf()函数
    • fputs()函数:用于向文件中写入一个字符串(不自动添加'\0')。其语法如下:
int fputs(const char *str, FILE *stream);

例如:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("output.txt", "w");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    char str[] = "这是要写入文件的内容";
    fputs(str, fp);
    fclose(fp);
    return 0;
}
- **`fprintf()`函数**:类似于`printf()`,但用于向文件中写入格式化数据。例如:
#include <stdio.h>
#include <stdlib.h>

struct Student {
    char name[20];
    int age;
};

int main() {
    FILE *fp = fopen("students_info.txt", "w");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    struct Student student = {"张三", 20};
    fprintf(fp, "姓名: %s, 年龄: %d\n", student.name, student.age);
    fclose(fp);
    return 0;
}
二进制文件的读写
  • 读二进制文件 - fread()函数
    fread()函数用于从文件中读取二进制数据。其语法如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

ptr是存储读取数据的内存地址,size是每个数据元素的大小,count是要读取的元素个数,stream是文件指针。例如,读取一个包含整数的二进制文件:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("data.bin", "rb");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    int buffer[10];
    size_t elements_read = fread(buffer, sizeof(int), 10, fp);
    printf("成功读取 %zu 个整数\n", elements_read);
    for (int i = 0; i < elements_read; i++) {
        printf("%d ", buffer[i]);
    }
    fclose(fp);
    return 0;
}
  • 写二进制文件 - fwrite()函数
    fwrite()函数用于向文件中写入二进制数据。其语法如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

例如,将一个整数数组写入二进制文件:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int data[] = {1, 2, 3, 4, 5};
    FILE *fp = fopen("output.bin", "wb");
    if (fp == NULL) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }
    size_t elements_written = fwrite(data, sizeof(int), 5, fp);
    printf("成功写入 %zu 个整数\n", elements_written);
    fclose(fp);
    return 0;
}

通过上述方法,可以在 C 程序中方便地对文本文件和二进制文件进行读写操作,实现数据的存储和读取。同时,注意在操作完文件后,使用fclose()函数关闭文件,释放相关资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值