Bootstrap

linux下c语言文件操作

本文将讲述linux系统下c语言操作文件

学习文件操作时,C 语言提供了一系列标准库函数来进行文件的创建、打开、读取、写入和关闭等操作。这些函数主要包含在 <stdio.h> 头文件中。以下是一些常用的文件操作接口:

  1. fopen(): 用于打开文件,并返回一个文件指针,可以用于后续的文件操作。语法为:FILE *fopen(const char *filename, const char *mode); 其中,filename 是要打开的文件名,mode 是打开文件的模式,比如只读、只写、追加等。

  2. fclose(): 用于关闭文件。语法为:int fclose(FILE *stream); 其中,stream 是要关闭的文件指针。

  3. fread()fwrite(): 用于读取和写入二进制数据。fread() 的语法为:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 其中,ptr 是数据读取的缓冲区,size 是每个数据项的大小,nmemb 是数据项的数量,stream 是文件指针。fwrite() 的语法类似,用于写入数据。

  4. fgets()fputs(): 用于读取和写入文本数据(一行)。fgets() 的语法为:char *fgets(char *str, int n, FILE *stream); 其中,str 是接收读取数据的缓冲区,n 是缓冲区大小,stream 是文件指针。fputs() 的语法类似,用于写入数据。

  5. fgetc()fputc(): 用于逐个字符地读取和写入文件。fgetc() 的语法为:int fgetc(FILE *stream); 其中,stream 是文件指针。fputc() 的语法类似,用于写入字符。

  6. fprintf()fscanf(): 用于格式化输入输出。fprintf() 的语法为:int fprintf(FILE *stream, const char *format, ...); 其中,stream 是文件指针,format 是格式化字符串,... 是可变数量的参数。fscanf() 的语法类似,用于从文件中按照指定格式读取数据。

  7. feof()ferror(): 用于检查文件的结束和错误状态。feof() 的语法为:int feof(FILE *stream); 其中,stream 是文件指针。ferror() 的语法类似,用于检查文件的错误状态。

 首先从创建文件开始

#include <stdio.h>

int main() {
    FILE *fp;

    // 创建一个新的文本文件,以只写模式打开
    fp = fopen("new_file.txt", "w");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法创建文件.\n");
        return 1;
    }

    // 关闭文件
    fclose(fp);

    printf("文件创建成功.\n");

    return 0;
}

了常见的只读、只写和读写模式之外,fopen() 函数还提供了一些其他的打开模式,可以根据需要选择。下面是一些常见的额外打开模式:

  1. 二进制模式

    • "rb": 二进制只读模式,以二进制模式打开一个已经存在的文件,文件必须存在,否则打开失败。
    • "wb": 二进制只写模式,以二进制模式创建一个新的文件,如果文件已经存在,则清空文件内容,如果文件不存在,则创建新文件。
    • "ab": 二进制追加模式,以二进制模式打开一个文件进行追加,如果文件不存在,则创建新文件,如果文件已存在,则在文件末尾追加内容。
    • "rb+": 二进制读写模式,以二进制模式打开一个文件进行读写,文件必须存在,否则打开失败。
    • "wb+": 二进制读写模式,以二进制模式创建一个新的文件进行读写,如果文件已经存在,则清空文件内容,如果文件不存在,则创建新文件。
    • "ab+": 二进制读写模式,以二进制模式打开一个文件进行读写,如果文件不存在,则创建新文件,如果文件已存在,则在文件末尾追加内容。
  2. 文本和二进制模式的混合

    • 在上述模式后加上 "t""b" 来指定是文本模式还是二进制模式。例如: "rt", "wt", "at", "rbt", "wbt", "abt"

可以看到文件创建成功 

之后来操作文件描述符写入文件

 

可以看到,插入代码

    char str[] = "This is test string";
    // 将字符串写入文件
    fputs(str, fp);

运行即可。

下面是在一个 .c 文件中调用文件操作的各种接口的示例代码:

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

int main() {
    FILE *fp;
    char str[] = "这是一个写入文件的字符串。";
    char buffer[100];
    int ch;

    // 创建一个新的文本文件,以只写模式打开
    fp = fopen("output.txt", "w");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法创建文件.\n");
        return 1;
    }

    // 将字符串写入文件
    fputs(str, fp);

    // 关闭文件
    fclose(fp);

    printf("字符串已成功写入文件.\n");

    // 重新以只读模式打开文件
    fp = fopen("output.txt", "r");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法打开文件.\n");
        return 1;
    }

    // 读取文件内容并输出到控制台
    printf("文件内容:\n");
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    // 关闭文件
    fclose(fp);

    printf("\n文件读取完毕.\n");

    // 以追加模式打开文件
    fp = fopen("output.txt", "a");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法打开文件.\n");
        return 1;
    }

    // 写入一行新的内容到文件
    fputs("\n这是追加的内容。", fp);

    // 关闭文件
    fclose(fp);

    printf("追加内容成功写入文件.\n");

    // 以只读模式打开文件
    fp = fopen("output.txt", "r");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法打开文件.\n");
        return 1;
    }

    // 使用 fgets 逐行读取文件内容并输出到控制台
    printf("文件内容(逐行):\n");
    while (fgets(buffer, sizeof(buffer), fp)) {
        printf("%s", buffer);
    }

    // 关闭文件
    fclose(fp);

    printf("文件逐行读取完毕.\n");

    // 以二进制只读模式打开文件
    fp = fopen("output.txt", "rb");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法打开文件.\n");
        return 1;
    }

    // 读取文件内容并输出到控制台
    printf("二进制文件内容:\n");
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    // 关闭文件
    fclose(fp);

    printf("\n二进制文件读取完毕.\n");

    // 以只读模式打开文件
    fp = fopen("output.txt", "r");

    // 检查文件是否成功打开
    if (fp == NULL) {
        printf("无法打开文件.\n");
        return 1;
    }

    // 使用 fscanf 从文件中按照指定格式读取数据
    printf("从文件中读取数据:\n");
    while (fscanf(fp, "%s", buffer) != EOF) {
        printf("%s ", buffer);
    }

    // 关闭文件
    fclose(fp);

    printf("\n从文件中读取数据完毕.\n");

    // // 删除文件
    // if (remove("output.txt") == 0) {
    //     printf("文件删除成功.\n");
    // } else {
    //     printf("无法删除文件.\n");
    // }

    return 0;
}

这个示例中,我们演示了以下操作:

  1. 创建一个新的文本文件并写入字符串。
  2. 以只读模式打开文件并逐个字符读取文件内容输出到控制台。
  3. 以追加模式打开文件并在文件末尾追加一行新的内容。
  4. 重新以只读模式打开文件,并使用 fgets 函数逐行读取文件内容输出到控制台。
  5. 以二进制只读模式打开文件并逐个字符读取文件内容输出到控制台。
  6. 重新以只读模式打开文件,并使用 fscanf 函数按照指定格式读取文件内容输出到控制台。
  7. 最后,删除文件(已注释)。
;