标准C库打开创建文件

标准C库打开创建文件

一、fopen函数

  FILE *fopen(const char *filename, const char *mode);

上面是C 语言标准库函数 fopen​ 的函数原型。这个函数用于打开一个文件,并返回一个指向 FILE​ 结构的指针,该结构包含了文件的所有信息(如文件的位置、错误状态等)。如果文件打开失败,则返回 NULL​。

函数参数的解释如下:

  1. const char *filename​: (包括路径,如果需要的话)。

  2. const char *mode​:这是一个指向字符串的指针,该字符串定义了文件被打开的方式(或模式)。模式字符串可以是以下字符的组合:

    • "r"​:以只读方式打开文件。文件必须存在。
    • "w"​:以写入方式打开文件。如果文件不存在,则创建它;如果文件存在,则其内容被清空(即文件被截断为 0 长度)。
    • "a"​:以追加模式打开文件。如果文件不存在,则创建它;如果文件存在,则写入的数据被追加到文件的末尾,而不会覆盖原有内容。
    • "r+"​:以读写方式打开文件。文件必须存在。
    • "w+"​:以读写方式打开文件。如果文件不存在,则创建它;如果文件存在,则其内容被清空。
    • "a+"​:以读写模式打开文件用于追加。如果文件不存在,则创建它;如果文件存在,则写入的数据被追加到文件的末尾,并且可以从文件的开头读取数据。

    此外,还可以在模式字符串中添加字符 "b"​(在 Windows 系统上),以二进制模式打开文件,但这在 Unix 和类 Unix 系统(如 Linux 和 macOS)上通常是可选的,因为默认情况下文件就是以二进制模式打开的。

二、fread函数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

函数原型 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);​ 是 C 语言标准库函数 fread​ 的函数原型,用于从指定的文件流中读取数据。下面是该函数各参数的详细解释:

  1. void *ptr​:这是一个指向内存块的指针,fread​ 将从文件中读取的数据存储到这个内存块中。这个内存块应该足够大,以容纳 size * nmemb​ 字节的数据。
  2. size_t size​:指定要读取的每个数据项的大小(以字节为单位)。这通常是你希望从文件中读取的数据类型的大小。例如,如果你希望读取整数(假设为 int​ 类型,在大多数系统上大小为 4 字节),则 size​ 应为 sizeof(int)​。
  3. size_t nmemb​:指定要读取的数据项的数量。例如,如果你希望读取 10 个整数,则 nmemb​ 应为 10。
  4. FILE *stream​:这是一个指向 FILE​ 对象的指针,该对象标识了要从中读取数据的文件流。这通常是通过 fopen​ 函数打开文件时返回的指针。

fread​ 函数会尝试从 stream​ 指向的文件流中读取 nmemb​ 个数据项,每个数据项的大小为 size​ 字节,并将这些数据存储在 ptr​ 指向的内存块中。函数返回成功读取的数据项的数量,这可能会小于 nmemb​,特别是当遇到文件结束或发生错误时。

为了在使用 fread​ 读取字符串后确保字符串以 null 终止符('\0'​)结尾,你需要确保分配的内存块足够大以容纳额外的 null 终止符,并且在读取后手动添加它。例如,如果你知道要读取的字符串最大长度为 MAX_LENGTH​,则应该分配 MAX_LENGTH + 1​ 字节的内存,并在读取后添加 null 终止符。

三、fwrite函数

fwrite​ 是 C 语言标准库中的一个函数,用于将数据块写入文件流。这个函数的原型如你所示:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

函数的参数说明如下:

  1. const void *ptr​:这是一个指向要写入数据的指针。这可以是任何类型的数据,但 fwrite​ 会按照字节来写入。
  2. size_t size​:这是每个数据项的大小(以字节为单位)。如果有一个 int​ 数组并想写入它,那么 size​ 应该是 sizeof(int)​。
  3. size_t nmemb​:这是要写入的数据项的数量。如果有一个包含 10 个 int​ 的数组并想写入它,那么 nmemb​ 就是 10。
  4. FILE *stream​:这是一个指向 FILE​ 对象的指针,该对象标识了要写入数据的文件流。这通常是通过 fopen​ 函数打开文件时返回的。

fwrite​ 函数返回成功写入的数据项的数量。如果发生错误或到达文件末尾,则可能返回小于 nmemb​ 的值。

以下是一个简单的示例,说明如何使用 fwrite​ 函数:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.bin", "wb"); // 打开一个二进制文件进行写入
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    int data[] = {1, 2, 3, 4, 5};
    size_t items_written = fwrite(data, sizeof(int), sizeof(data)/sizeof(int), file);

    if (items_written != sizeof(data)/sizeof(int)) {
        fprintf(stderr, "Failed to write all items.\n");
    }

    fclose(file); // 关闭文件
    return 0;
}

在这个示例中,打开了一个名为 “output.bin” 的二进制文件,并将一个整数数组写入该文件。我们使用 sizeof(int)​ 来确定每个数据项的大小,并使用 sizeof(data)/sizeof(int)​ 来确定要写入的数据项的数量。

四、例子综合说明

首先,代码包含了两个头文件:

#include <stdio.h>
#include <string.h>
  • <stdio.h>​:用于标准输入输出函数,如printf​、fopen​、fclose​等。
  • <string.h>​:用于字符串操作函数,如strlen​。

接下来是main​函数的开始:

int main()
{

然后,声明了一个文件指针fp​和一个指向字符串的指针str​,以及一个字符数组readBuf​用于存储从文件中读取的数据:

FILE *fp;
char *str = "you are sb";
char readBuf[50];

接下来,以读写模式(“w+”)打开一个名为xu.txt​的文件,并将返回的文件指针存储在fp​中:

fp = fopen("./xu.txt","w+");

如果文件打开失败(例如,由于权限问题或磁盘空间不足),fp​将被设置为NULL​。检查这一点并输出一个错误消息:

if(fp == NULL){
    printf("Error opening file");
    return 1;
}

然后,使用fwrite​函数将字符串str​写入文件。指定了每个数据项的大小为sizeof(char)​(即1字节),并写入了strlen(str)+1​个这样的数据项(包括字符串的结束符\0​):

fwrite(str,sizeof(char),strlen(str)+1,fp);

之后,使用fseek​函数将文件指针移回文件的开头,以便稍后读取数据:

fseek(fp,0,SEEK_SET);
size_t rd_size= fread(readBuf,sizeof(char),strlen(str),fp);

接下来,检查fread​的返回值(即读取的字符数)是否大于0,并据此决定是否打印读取到的数据或错误消息:

if(rd_size>0){
    readBuf[rd_size] = '\0'; /
    printf("read data:%s\n",readBuf);
}else{
    printf("Failed to read data from file.\n");
}

最后,正确地使用fclose​关闭了文件并返回0表示程序正常退出:

fclose(fp);
return 0;

下面是代码

#include <stdio.h>
#include <string.h>

int main()
{
    // FILE *fopen(const char *filename, const char *mode);

    FILE *fp;
    // 定义一个指向字符的指针str,并初始化为一个字符串字面量
    char *str = "hello word!";
    // 定义一个字符数组readBuf,用于存储从文件中读取的数据
    char readBuf[50];

    // 使用fopen函数以写加读模式("w+")打开一个名为"./xu.txt"的文件
    // 如果文件不存在,则创建它;如果已存在,则清空内容
    fp = fopen("./xu.txt","w+");
    // 检查文件是否成功打开
    if(fp == NULL){
        printf("Error opening file");
        // 如果文件打开失败,则返回1表示程序出错
        return 1;
    }

    // 使用fwrite函数将字符串str写入文件
    // 注意这里包括了字符串的结束符'\0'
    fwrite(str,sizeof(char),strlen(str)+1,fp);

    // 使用fseek函数将文件指针重置到文件的开始位置
    fseek(fp,0,SEEK_SET);

    // 使用fread函数尝试从文件中读取和原字符串同样长度的字符(不包括'\0')
    size_t rd_size= fread(readBuf,sizeof(char),strlen(str),fp);

    // 检查是否成功读取到数据
    if(rd_size>0){
        readBuf[rd_size] = '\0';
        printf("read data:%s\n",readBuf);
    }else{
        printf("Failed to read data from file.\n");
    }

    // 关闭文件
    fclose(fp);

    // 程序正常结束,返回0
    return 0;
}

  • 35
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值