📜  fwrite() 与 write()(1)

📅  最后修改于: 2023-12-03 14:41:21.040000             🧑  作者: Mango

介绍

在C语言中,fwrite()write()都是用于将指定数据写入文件的函数。它们之间的主要区别在于 fwrite()是C库函数,而write()是UNIX系统调用函数。因此,write()使用起来可能相对更加底层和灵活。

fwrite()

fwrite()函数用于将指定数据写入指定文件中。该函数的完整原型如下:

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

该函数的参数解释如下:

  • ptr:待写入数据的地址;
  • size:待写入数据类型的字节数;
  • nmemb:待写入数据的个数;
  • stream:指向FILE类型结构体的文件指针。

fwrite()函数的返回值是成功写入的数据块数。

write()

write()函数属于UNIX/Linux系的系统调用,在标准C库中不提供该函数。该函数的完整原型如下:

ssize_t write(int fd, const void *buf, size_t count);

该函数的参数解释如下:

  • fd:文件描述符;
  • buf:待写入数据的地址;
  • count:待写入数据的字节数。

write()函数的返回值是成功写入的数据字节数。

区别

相比fwrite()函数,write()函数具有以下特点:

  • write()函数属于系统调用,比fwrite()更加底层和灵活;
  • write()函数更加适合于直接操作设备,例如socket和管道。而fwrite()函数会缓冲数据,不适合于对文件进行高度定制的操作。

示例

fwrite()
#include <stdio.h>

int main() {
    FILE *fp = fopen("test.txt", "w");
    if (fp == NULL) {
        perror("fopen");
        return 1;
    }
    
    char buffer[] = "Hello, world!";
    size_t result = fwrite(buffer, sizeof(char), sizeof(buffer), fp);
    printf("fwrite() %zu bytes successfully!\n", result);
    
    fclose(fp);
    return 0;
}

以上代码打开一个名为 test.txt 的文件,写入了字符串 Hello, world!。并在控制台输出写入成功的字节数。

write()
#include<unistd.h>

int main()
{
    int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1)
    {
        perror("open");
        return 1;
    }
    
    char buffer[] = "Hello, world!";
    ssize_t result = write(fd, buffer, sizeof(buffer));
    printf("write() %zd bytes successfully!\n", result);

    close(fd);
    return 0;
}

以上代码也打开了一个名为test.txt的文件,写入了 Hello, world! 字符串。并在控制台输出写入成功的字节数。与fwrite()相比,需要手动打开文件描述符,但这样可以更加灵活地控制文件写入。