c语言中的文件和文件操作

一.什么是文件

文件是存储在计算机系统中的一组有序的数据集合,可以包含文本、图像、音频、视频等各种信息形式。文件可以通过文件系统进行管理和组织,可以被读取、写入、修改和删除。文件是计算机系统中存储和处理数据的基本单位,能够对数据进行持久化存储,方便用户使用和管理。

但是在程序设计中我们一般将文件以文件的功能分为两类:程序文件和数据文件.

  1.程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)

2.数据文件

数据文件是存储数据的文件。它可以包含各种类型的数据,例如文本、数字、图形、音频等。数据文件通常以二进制或文本格式保存,可以通过计算机程序来读取和写入数据。

数据文件可以储存在计算机的硬盘驱动器或其他存储介质上,如固态硬盘、USB闪存驱动器、光盘等。常见的数据文件格式包括CSV(逗号分隔值)、XML(可扩展标记语言)、JSON(JavaScript对象表示)等。

二.文件名

文件名是一个用来标识和区分不同文件的字符串或标签。它通常是文件在文件系统中的唯一标识符,并且由字母、数字、下划线和其他特定字符组成。文件名通常用来指定文件的类型、内容和用途,以方便用户和计算机系统进行管理和访问。在某些操作系统中,文件名的长度和允许的字符集可能有限制。

文件名包含三个部分:文件路径+文件名主干+文件后缀

比如:D:\biangcheng\编程\文件操作\test.c

三.文件的打开和关闭

下面是一个利用C语言文件操作的示例:

#include <stdio.h>

int main() {
    // 创建文件//fopen为打开文件
    FILE *file = fopen("test.txt", "w");
    if (file == NULL) {
        printf("无法创建文件!\n");
        return -1;
    }

    // 写入数据到文件
    char str[] = "Hello, World!";
    fputs(str, file);

    // 关闭文件
    fclose(file);

    // 打开文件进行读取
    file = fopen("test.txt", "r");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return -1;
    }

    // 从文件中读取数据并输出
    char buffer[100];
    fgets(buffer, sizeof(buffer), file);
    printf("文件内容:%s\n", buffer);

    // 关闭文件
    fclose(file);

    return 0;
}

文件的打开如同喝水一般:想要喝一瓶矿泉水就有三步 1 打开水瓶盖(上述代码中的打开文件夹)

2.喝水(对代码的读取以及输入或输出) 3.关闭水瓶盖(关闭文件).

上述代码首先创建一个名为test.txt的文件,并将字符串"Hello, World!"写入到文件中。然后,重新打开该文件进行读取,将文件内容读取到一个缓冲区中,并输出到终端上。最后,关闭文件。

在使用文件操作函数时,需要注意以下几点:

  • fopen函数用于打开文件,第一个参数是文件路径,第二个参数是打开方式(如“w”表示写入方式,"r"表示读取方式)。
  • fputs函数用于向文件写入字符串。
  • fclose函数用于关闭文件。
  • fgets函数用于从文件中读取字符串。
  • 在进行文件操作时,应该检查文件是否成功打开或关闭。

在上面代码利用了文件指针

文件指针是指在程序中用于访问文件的一个指针变量。它记录了当前读取或写入文件的位置,通过文件指针,程序可以在文件中移动,读取或写入特定位置的数据。文件指针通常用于文件的打开、关闭、读取和写入操作。在不同的编程语言中,文件指针的实现方式有所不同,但其基本原理相同。

一般都是用过一个FILE的指针来维护这个FILE结构的变量

*FILE ps;

 文件其中还有很多打开模式.

四.文件顺序的读写

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输出流
fread⼆进制输⼊文件
fwrite⼆进制输出文件

4.1  fputs文本行写入(输出到文件里) 

fputc函数是在C语言中用于将一个字符写入到文件中的函数。它的函数原型如下:

int fputc(int c, FILE *stream);

参数c表示要写入的字符,stream表示要写入的文件流。该函数将返回写入成功的字符。

示例用法:

#include <stdio.h>

int main() 
{
    FILE *file = fopen("test.txt", "w");
    if (file == NULL) 
    {
        printf("无法打开文件");
        return 1;
    }
    
    fputc('H', file);
    fputc('e', file);
    fputc('l', file);
    fputc('l', file);
    fputc('o', file);
    
    fclose(file);
    return 0;
}

上述代码将字符序列"Hello"写入到名为"test.txt"的文件中。当文件打开失败时,会返回"无法打开文件"并终止程序。

4.2 关于fgets文本行读取

fgets函数是C语言中的一个输入函数,用于从文件流中读取一行字符串。

函数原型如下:

char *fgets(char *str, int char, FILE *stream);

参数说明: str:指向字符数组的指针,用于存储读取到的字符串。 n:指定最多读取的字符数,包括最后的换行符(如果有的话)。 stream:指向FILE对象的指针,表示要读取的文件流。

返回值: 如果成功,返回str的值;如果读取到文件结束符或发生错误,返回NULL。

使用示例:

#include <stdio.h>

int main() 
{
    FILE *file = fopen("input.txt", "r");
    char buffer[256];
    if (file) 
    {
        while (fgets(buffer, sizeof(buffer), file)) 
        {  
            printf("%s", buffer);
        }
        fclose(file);
    }
    
    return 0;
}

以上示例中,fgets函数会从文件流中读取一行字符串保存到buffer中,然后使用printf函数打印出来。循环执行直到文件结束。最后需要关闭文件流。

4.3 fputc字符写入 

fputc函数是C语言中的一个输出函数,它用于将一个字符写入到指定的文件中。

函数原型如下:

int fputc(int char, FILE *stream);

参数说明:

  • c: 要写入的字符
  • stream: 指定要写入字符的文件流

返回值:

  • 如果写入成功,返回写入的字符;如果写入失败,返回EOF。

示例代码:

#include <stdio.h>

int main() {
    FILE *file = fopen("text.txt", "w");
    if (file == NULL) {
        printf("文件打开失败\n");
        return -1;
    }

    char ch = 'A';

    if (fputc(ch, file) == EOF) {
        printf("写入失败\n");
        return -1;
    }
    printf("写入成功\n");

    fclose(file);

    return 0;
}

以上代码将字符'A'写入到文件text.txt中。如果写入成功,输出"写入成功";如果写入失败,输出"写入失败"。

4.4 fgetc字符串读取

fgetc函数是C语言中的标准库函数,用于从文件中读取一个字符。函数原型如下:

int fgetc(FILE *stream)

参数stream是一个指向FILE对象的指针,它指向要读取的文件流。函数返回读取的字符,如果到达文件末尾或发生错误,返回EOF(表示End-of-File)。

下面是一个示例,演示如何使用fgetc函数逐个字符地从文件中读取并输出:

#include <stdio.h>

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

    file = fopen("file.txt", "r");
    if(file == NULL) {
        printf("Failed to open file.\n");
        return -1;
    }

    while ((c = fgetc(file)) != EOF) {
        printf("%c", c);
    }

    fclose(file);

    return 0;
}

在上面的示例中,我们首先打开一个名为"file.txt"的文件,并进行错误检查。然后,使用while循环和fgetc函数从文件中读取每个字符,并使用printf函数将其输出到屏幕上。循环继续,直到读取到文件末尾为止。最后,使用fclose函数关闭文件。

请注意,fgetc函数每次只能读取一个字符。如果需要读取一行或更多的字符,可以使用fgets函数。另外,要记得在使用完文件后关闭它,以释放资源。

其中与上方的fgets有很多相似之处

fgets和fgetc是C语言中的两个输入函数,用于从文件中读取字符。它们的相同之处如下:

  1. 都可以用于从文件中读取字符。
  2. 都需要一个文件指针作为参数。
  3. 都可以逐个字符地读取文件内容。
  4. 都会在遇到文件结尾或读取到指定字符时停止读取。

需要注意的是,fgets函数可以一次读取多个字符,并且会包括换行符在内,而fgetc函数每次只能读取一个字符。另外,fgets函数返回一个字符串指针,而fgetc函数返回一个整数。

fgets和fgetc都是C语言中用于读取文件的函数,但两者有一些区别。

  1. 参数不同:fgets函数的参数包括一个字符数组指针、读取字符的最大数量和文件指针,而fgetc函数的参数只有一个文件指针。

  2. 功能不同:fgets函数用于一次读取一行字符,包括换行符,直到遇到换行符或读取到指定数量的字符为止。而fgetc函数用于一次读取一个字符。

  3. 返回值不同:fgets函数返回读取到的字符数组指针,如果读取失败或到达文件结尾,则返回NULL。而fgetc函数返回读取到的字符或EOF(如果到达文件结尾)。

  4. 使用范围不同:fgets函数常用于处理文本文件的逐行读取,而fgetc函数可用于读取任意类型的文件。

综上所述,fgets适合读取文本文件的一行字符,而fgetc适合逐个字符地读取文件的内容。

4.5 fseek

根据⽂件指针的位置和偏移量来定位⽂件指针。

fseek函数是C语言中的文件定位函数。

 int fseek(FILE *stream, long int offset, int whence);

参数说明:

  • stream:文件指针,指向要移动文件位置指针的文件。
  • offset:偏移量,即要移动的字节数。
  • whence:指定一个起始位置,可以取以下值:
    • SEEK_SET:从文件起始位置开始。
    • SEEK_CUR:从当前位置开始。
    • SEEK_END:从文件末尾位置开始。

返回值说明:

  • 返回0表示移动成功。
  • 返回非0值表示移动失败。

使用fseek函数可以实现以下功能:

  • 定位到文件的指定位置进行读写操作。
  • 定位到文件末尾添加数据(利用fseek(stream, 0, SEEK_END))。
  • 获取当前文件指针的位置(利用ftell函数)。

需要注意的是,fseek函数的offset参数指定的是字节数,而不是行数或字符数。

#include <stdio.h>

int main() {
    FILE *fp = fopen("file.txt", "r");
    if (fp == NULL) {
        printf("Failed to open file.\n");
        return 1;
    }
    
    // 定位文件指针到第10个字节处
    if (fseek(fp, 10, SEEK_SET) != 0) {
        printf("Failed to seek file.\n");
        fclose(fp);
        return 1;
    }
    
    // 读取文件中的内容
    char buffer[100];
    if (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("Read content: %s", buffer);
    } else {
        printf("Failed to read file.\n");
    }
    
    fclose(fp);
    return 0;
}
 

在上面示例中我们首先打开了一个名为file.txt的文本文件,然后使用fseek函数将文件指针定位到第10个字节处,最后读取了文件中的内容并打印出来。 

4.6 printf fprintf sprintf 区别

printf、fprintf和sprintf都是C语言中用于输出信息的函数,但它们在输出的方式和输出的位置上有所不同。

  1. printf函数:用于将格式化的数据输出到标准输出(通常是显示器)。它的函数原型为:

    int printf(const char *format, ...);示例:

    printf("Hello, world!\n");
    printf("The value of x is %d\n", x);
    
  2. fprintf函数:用于将格式化的数据输出到指定的文件中。它的函数原型为:

    int fprintf(FILE *stream, const char *format, ...);示例:

    FILE *file = fopen("output.txt", "w");
    fprintf(file, "Hello, world!\n");
    fprintf(file, "The value of x is %d\n", x);
    fclose(file);
    
  3. sprintf函数:将格式化的数据输出到字符串中。它的函数原型为:

    int sprintf(char *str, const char *format, ...);示例:

    char str[100];
    sprintf(str, "Hello, world!\n");
    sprintf(str, "The value of x is %d\n", x);
    

总结:printf函数接将输出信息显示在屏幕上,fprintf函数将输出信息写入指定的文件,而sprintf函数将输出信息保存到一个字符串中。

4.7 scanf fscanf sscanf 区别

scanf、fscanf和sscanf是C语言中常用的输入函数,主要用于从标准输入或文件中读取数据。它们之间的区别如下:

  1. scanf:从标准输入读取数据,格式化输入。可以读取多个变量,以空格、制表符或换行符分隔。返回成功读取的参数数目。

  2. fscanf:从文件中读取数据,格式化输入。与scanf类似,可以读取多个变量,以空格、制表符或换行符分隔。返回成功读取的参数数目。

  3. sscanf:从字符串中读取数据,格式化输入。与scanf和fscanf不同,它不是从标准输入或文件中读取数据,而是从字符串中解析数据。返回成功读取的参数数目。

总结:

scanf用于从标准输入读取数据,fscanf用于从文件中读取数据,sscanf用于从字符串中读取数据。它们的参数格式和用法类似,返回值表示成功读取的参数数目。

五.文本文件与二进制文件 

根据数据的组织形式,数据文件被称为文本文件或者二进制文件.

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件.

文本文件和二进制文件在存储和处理方式上也有一些不同。文本文件可以直接在文本编辑器中打开、编辑和保存,而二进制文件通常需要通过特定的程序进行读取和处理。在存储方面,文本文件通常占用的空间较小,因为它们使用的是字符编码来存储数据;而二进制文件由于可以存储任意类型的数据,所以占用的空间较大。

总结来说,文本文件适用于存储和处理纯文本数据,易于理解和编辑;而二进制文件适用于存储和处理任意类型的数据,可以保存更多的细节和信息。两者在实际应用中常常相互转换和配合使用,以满足不同的需求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值