标准C库打开创建文件

本篇文章,简单看看fopen、fread、fwrite、fseek、fclose、fgetc、fputc、feof的用法。

fopenopen 都是用于打开文件的函数,但它们有几个主要的区别:

参考:总结open与fopen的区别 - NickyYe - 博客园 (cnblogs.com)

  1. 用法和参数:

    • fopen 是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。它的原型为 FILE *fopen(const char *filename, const char *mode);,接受文件名和打开模式作为参数。
    • open 是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。它的原型为 int open(const char *pathname, int flags, mode_t mode);,接受文件路径、打开标志和文件权限作为参数。

        `fopen`是C标准函数,因此拥有良好的移植性;而`open`是UNIX系统调用,移植性有限。

  1. 返回值:

    • fopen 返回一个指向 FILE 结构的指针,表示打开的文件流。如果打开文件失败,则返回 NULL
    • open 返回一个整数文件描述符,表示打开的文件。如果打开文件失败,则返回 -1。
  2. 使用场景:

    • fopen 通常用于 C 语言中,特别是在需要进行文件输入输出时。
    • open 更多地用于 Unix-like 系统中,特别是在系统级编程中,如系统调用或在 C 语言中直接调用 POSIX API。
  3. 功能:

    • fopen 提供了更高级的文件操作功能,如读写文件、格式化输入输出等。
    • open 是更低级的接口,主要用于打开文件和获取文件描述符,而不提供像 fopen 那样的高级文件操作功能。

总的来说,如果你只需要简单地打开文件并进行读写操作,使用 fopen 更加方便。但如果你需要更底层的文件操作或与系统级别的 API 交互,那么使用 open 更为合适。

下面演示标准C库打开创建文件:

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

int main(int argc, char **argv)
{
        FILE *fp;;
        char *str = "lanzhao handsome";
        char readBuf[128] = {0};

        fp = fopen("./zhao.txt", "w+"); //w+ 表示创建一个可读可写的新文件

        fwrite(str, sizeof(char)*strlen(str), 1, fp); 
        //第二个参数表示一次性写多少个,第三个参数表示写几次

        fseek(fp, 0, SEEK_SET); // 移动光标位置到开头

        fread(readBuf, sizeof(char)*strlen(str), 1, fp);
        //第二个参数表示一次性读多少个,第三个参数表示读几次
        //也可以写成下面这种形式:表示一次性读sizeof(char)个,读strlen(str)次
        //fread(readBuf, sizeof(char),strlen(str), fp);

        printf("read data: %s\n", readBuf);

        fclose(fp);

        return 0;
}

运行结果如下图所示:

grep "struct Test" *

这个命令是一个常用的命令行工具 grep 的使用示例,用于在当前目录下的所有文件中查找包含字符串 "struct Test" 的行。

具体地说,命令的各个部分的含义如下:

  • grep: 是一个用于搜索文本的命令行工具,在 Linux 和类 Unix 系统中常用。它可以在文件中搜索指定的字符串模式,并将包含该模式的行输出到标准输出。

  • "struct Test": 是要搜索的字符串模式,即要查找的内容。在这个例子中,它是一个包含在双引号中的字符串,表示要查找的内容是 "struct Test" 这个字符串。grep 将会搜索文件中是否包含该字符串。

  • *: 是一个通配符,用于匹配当前目录下的所有文件。它会被展开成当前目录下的所有文件名,并作为 grep 命令的参数,告诉 grep 在这些文件中搜索指定的字符串模式。

因此,整个命令的意思是,在当前目录下的所有文件中,搜索包含字符串 "struct Test" 的行,并将这些行输出到标准输出。

下面展示读写结构体:

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

struct Test{
        int a;
        char b;
};


int main(int argc, char **argv)
{
        FILE *fp;

        struct Test data = {100, 'a'};
        struct Test data2;

        fp = fopen("./file1", "w+");
        int n_write = fwrite(&data, sizeof(struct Test), 1, fp);
        printf("n_write = %d\n", n_write);

        fseek(fp, 0, SEEK_SET);

        int n_read = fread(&data2, sizeof(struct Test), 1, fp);
        printf("n_read = %d\n", n_read);

        printf("read %d, %c\n", data2.a, data2.b);

        fclose(fp);

        return 0;
}

 下面展示fputc,用于将一个字符写入到指定的文件流中的用法:

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


int main()
{
        FILE *fp;
        int i;
        char *str = "lanzhao handsome!";
        int len = strlen(str);

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

        for(i = 0; i < len; i++){

                fputc(*str,fp);
                str++;
        }
        fclose(fp);

        return 0;
}

 运行结果如下,把字符串一个一个字符的放到text.txt中。

 下面展示fgetc和feof , fgetc用于从指定的文件流中读取一个字符,一个一个读出来。feof 用于检查文件流的结束标志,检查是否已经读到文件的尾巴。

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


int main()
{
        FILE *fp;
        char c;

        fp = fopen("./text.txt", "r"); // 以只读的方式打开文件
        while(!feof(fp)){        //feof在没有到达文件末尾时,返回0。到达末尾后返回非零值
                c = fgetc(fp);  //从fp文件流中获得1个字符
                printf("%c", c);//打印出获得的字符
        }

        fclose(fp);
        return 0;
}

Linux文件编程到此结束...... 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值