C语言学习笔记——文件操作
发布日期:2021-05-17 07:35:17 浏览次数:18 分类:精选文章

本文共 3784 字,大约阅读时间需要 12 分钟。

C语言学习笔记

文件操作

文件操作是C语言编程中非常基础但重要的内容。文件操作主要包括打开文件、读取文件和写入文件等功能。这些操作通常涉及到标准库函数的使用,这些函数能够帮助开发者高效地处理文件数据。

文件操作的核心函数:fopen

在C语言中,文件的读写和修改主要通过fopen函数来实现。该函数用于打开文件,返回一个文件指针,供后续的读写操作使用。理解fopen函数的使用方式,是掌握文件操作的关键。

fopen函数的函数原型为:FILE * fopen(const char *filename, const char *mode);

函数的两个主要参数:

  • filename(文件路径):可以是绝对路径或相对路径。绝对路径从根目录开始计算,相对路径则从执行程序的当前目录开始。

  • mode(文件打开模式):决定了文件的打开方式。常用的模式包括:

    "r":只读模式,适用于需要读取文件但不修改的场景。
    "w":写入模式,文件存在时会擦除原有内容,新内容从开头开始写入。文件不存在时会自动创建。
    "a":写入模式,文件存在时会在文件末尾继续写入新内容。文件不存在时会自动创建。
    "r+":读写模式,既可以读取文件内容,也可以向文件中写入新数据。
    "w+":写入模式,与"w"类似,但允许在读写时修改文件内容。
    "a":类似"w",但允许在文件末尾追加写入数据。

需要注意:

  • 文件打开失败时,fopen函数返回NULL。

  • 文件操作完成后,一定要通过fclose函数关闭文件,以释放内存资源,并确保数据已保存到磁盘中。

二进制模式下的文件操作

除了文本模式外,C语言还支持二进制模式下的文件操作。二进制模式的文件处理方式与文本模式相似,但具体的打开模式字符略有不同。常用的二进制模式包括:

"rb":二进制只读模式。
"wb":二进制读写模式。
"ab":二进制追加写入模式。
"r+b":二进制读写模式,允许随机访问。
"w+b":二进制读写模式,允许随机访问。
"a+b":二进制追加写入模式,允许随机访问。

二进制模式与文本模式的主要区别在于换行符的处理。文本模式下使用的换行符是\n,而二进制模式下需要使用\r\n来表示换行。

高效文件操作:fopen_s和errno_t

在某些情况下,开发者可能需要使用带有错误码返回值的文件操作函数。fopen_s函数的函数原型为:errno_t fopen_s(FILE **pFile, const char *filename, const char *mode);

该函数与fopen的功能一致,但返回值是一个整数类型,表示错误码。成功打开文件时返回0,错误时返回相应的错误代码。这种方式可以让开发者更方便地判断文件操作的结果,并结合 strerror函数查看错误信息。

高效读写数据:fwrite

在文件操作中,除了fopen函数外,fwrite函数是读写数据的核心工具。它用于将数据块写入文件中。函数原型为:size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);

函数参数说明:

  • buffer(数据缓冲区):存储要写入文件的数据。

  • size(数据单元大小):每个数据单元的大小。

  • count(写入的数据单元数量):决定要写入多少个数据单元。

  • stream(文件指针):用于指定要写入的文件。

注意事项:

  • 文件打开后,一定要通过fclose函数关闭文件,否则可能导致内存泄漏。

  • 在使用fwrite函数时,需要确保缓冲区内的数据是可读的。如果文件操作失败,需要检查错误信息。

  • 在文本模式下,换行符会自动转换为\r\n,但在二进制模式下,write函数直接写入数据,不会自动处理换行符。因此,在二进制模式下,如果需要换行,需要手动添加\r\n

读取文件数据:fread

读取文件数据的核心函数是fread。它用于从文件中读取数据到缓冲区中。函数原型为:size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

函数参数说明:

  • buffer(读取到的数据存储位置):用于存储从文件中读取的数据。

  • size(数据单元大小):每个数据单元的大小。

  • count(读取的数据单元数量):决定要读取多少个数据单元。

  • stream(文件指针):用于指定要读取的文件。

注意事项:

  • 在读取文件时,一定要确保文件已经被正确打开。如果使用w模式打开文件,文件可能会被擦除,导致读取失败。

  • 文件读取操作通常需要在循环中使用feof函数来判断是否已经读到文件结尾。

  • 如果读取的数据长度大于文件的总字节数,fread函数会返回0,表示读取完成。

文本模式与二进制模式的选择

在实际开发中,选择使用文本模式还是二进制模式需要根据具体需求来决定。文本模式的优势是换行符处理更加简单,系统默认会将\n转换为\r\n,适合大多数应用场景。而二进制模式则更灵活,适合对文件进行随机访问和修改的操作。

高效读写结构体数据

在C语言中,结构体数据可以通过freadfwrite函数进行读写操作。这种方法可以有效地将结构体数据保存到文件中,并在需要时重新读取。需要注意的是,结构体的内存对齐可能会导致一些问题,特别是在不同平台上可能会有不同的表现。

以下示例代码展示了如何使用freadfwrite函数来读写结构体数据:

struct Person {    char name[20];    int age;    char address[50];};FILE *pFile = fopen("person.txt", "w+b");struct Person person = {    .name = "张三",    .age = 25,    .address = "北京市朝阳区"};fwrite(&person, sizeof(struct Person), 1, pFile);fclose(pFile);

运行上述代码后,文件person.txt中将包含:

张三 25 北京市朝阳区

fputs和fgets:单字节读写操作

fputsfgets函数用于进行单字节的读写操作。它们适用于处理文本文件,特别是当数据量较小时。fputs函数将给定的字符串写入文件中,而fgets函数从文件中读取一行数据。

函数原型:

  • int fputs(const char *str, FILE *stream);

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

注意事项:

  • fgets函数返回NULL当到达文件末尾或读取失败时。

  • 在使用fgets函数时,需要确保输入缓冲区足够大,否则可能会导致数据丢失。

格式化读写:fprintf和fscanf

在某些情况下,直接读写字节可能不够方便。为了格式化输出或输入,C语言提供了fprintffscanf函数。它们的使用方式与printfscanf相似,但目标是文件而不是标准输出或输入。

函数原型:

  • int fprintf(FILE *stream, const char *format, ...);
  • int fscanf(FILE *stream, const char *format, ...);

示例:

int a, b;double c;fprintf(pFile, "%d,%s,%.2f", a, "test", c);fscanf(pFile, "%d,%s,%.2f", &a, str, &c);

注意事项:

  • 在使用fscanf函数时,需要确保目标变量已经被初始化,否则可能导致未初始化的栈溢出错误。

  • 格式化字符串中的%符号必须与对应的输入参数一一对应,否则可能导致读取错误。

文件定位与定位:fseek和ftell

在某些情况下,开发者需要对文件的位置进行操作。fseek函数可以用来移动文件指针的位置,而ftell函数可以用来获取文件指针的当前位置。

函数原型:

  • int fseek(FILE *stream, long offset, int origin);
  • long ftell(FILE *stream);

注意事项:

  • 文件定位的位置参数可以是正数(向前移动)、负数(向后移动)或0(定位到文件起始位置)。

  • 文件定位的操作可能会导致文件指针的位置改变,需要谨慎使用。

关闭文件:fclose

在完成文件操作后,一定要通过fclose函数关闭文件。关闭文件的目的是释放内存资源,并确保文件中的数据已保存到磁盘中。函数原型为:int fclose(FILE *stream);

注意事项:

  • 文件操作失败时,fclose函数仍然需要被调用,否则可能导致内存泄漏。

  • 在多任务环境下,关闭文件必须在任务终止前完成,否则可能导致资源未释放。

总之,文件操作是C语言编程中的基础内容。掌握fopenfwritefread等函数的使用方法,是开发高效文件管理应用的关键。在实际开发中,需要根据具体需求选择合适的文件操作模式和函数,以确保程序的高效运行和稳定性。

上一篇:C语言实战——学生管理系统
下一篇:C语言学习笔记——位运算

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月12日 16时51分40秒